import { ContractTransaction } from 'ethers';
import { BigNumber } from '@ethersproject/bignumber';
import { TransactionReceipt } from '@ethersproject/abstract-provider';
import * as core from '@nomad-xyz/contracts-core';
import { NomadContext } from '..';
import { MessageProof } from '../NomadContext';
import { Dispatch, ParsedMessage, MessageStatus, ReplicaMessageStatus } from './types';
import { MessageBackend } from '../messageBackend';
/**
 * Parse a serialized Nomad message from raw bytes.
 *
 * @param message
 * @returns
 */
export declare function parseMessage(message: string): ParsedMessage;
/**
 * A deserialized Nomad message.
 */
export declare class NomadMessage<T extends NomadContext> {
    readonly dispatch: Dispatch;
    readonly message: ParsedMessage;
    readonly home: core.Home;
    readonly replica: core.Replica;
    readonly context: T;
    protected _confirmAt?: Date;
    readonly _backend?: MessageBackend;
    constructor(context: T, dispatch: Dispatch, _backend?: MessageBackend);
    get backend(): MessageBackend;
    get messageHash(): string;
    /**
     * Instantiate one or more messages from a receipt.
     *
     * @param context the {@link NomadContext} object to use
     * @param receipt the receipt
     * @returns an array of {@link NomadMessage} objects
     */
    static baseFromReceipt<T extends NomadContext>(context: T, receipt: TransactionReceipt): Promise<NomadMessage<T>[]>;
    /**
     * Instantiate EXACTLY one message from a receipt.
     *
     * @param context the {@link NomadContext} object to use
     * @param receipt the receipt
     * @returns an array of {@link NomadMessage} objects
     * @throws if there is not EXACTLY 1 dispatch in the receipt
     */
    static baseSingleFromReceipt<T extends NomadContext>(context: T, receipt: TransactionReceipt): Promise<NomadMessage<T>>;
    /**
     * Instantiate one or more messages from a tx hash.
     *
     * @param context the {@link NomadContext} object to use
     * @param nameOrDomain the domain on which the receipt was logged
     * @param transactionHash the transaction hash on the origin chain
     * @returns an array of {@link NomadMessage} objects
     * @throws if there is no receipt for the TX
     */
    static baseFromTransactionHash<T extends NomadContext>(context: T, nameOrDomain: string | number, transactionHash: string): Promise<NomadMessage<T>[]>;
    /**
     * Instantiate EXACTLY one message from a transaction has.
     *
     * @param context the {@link NomadContext} object to use
     * @param nameOrDomain the domain on which the receipt was logged
     * @param transactionHash the transaction hash on the origin chain
     * @returns an array of {@link NomadMessage} objects
     * @throws if there is no receipt for the TX, or if not EXACTLY 1 dispatch in
     *         the receipt
     */
    static baseSingleFromTransactionHash<T extends NomadContext>(context: T, nameOrDomain: string | number, transactionHash: string): Promise<NomadMessage<T>>;
    static baseFirstFromBackend<T extends NomadContext>(context: T, transactionHash: string): Promise<NomadMessage<T>>;
    static baseFromMessageHash<T extends NomadContext>(context: T, messageHash: string): Promise<NomadMessage<T>>;
    /**
     * Get the `Relay` event associated with this message (if any)
     *
     * @returns An relay tx (if any)
     */
    getRelay(): Promise<string | undefined>;
    /**
     * Get the `Update` event associated with this message (if any)
     *
     * @returns An update tx (if any)
     */
    getUpdate(): Promise<string | undefined>;
    /**
     * Get the Replica `Process` event associated with this message (if any)
     *
     * @returns An process tx (if any)
     */
    getProcess(): Promise<string | undefined>;
    /**
     * Returns the timestamp after which it is possible to process this message.
     *
     * Note: return the timestamp after which it is possible to process messages
     * within an Update. The timestamp is most relevant during the time AFTER the
     * Update has been Relayed to the Replica and BEFORE the message in question
     * has been Processed.
     *
     * Considerations:
     * - the timestamp will be 0 if the Update has not been relayed to the Replica
     * - after the Update has been relayed to the Replica, the timestamp will be
     *   non-zero forever (even after all messages in the Update have been
     *   processed)
     * - if the timestamp is in the future, the challenge period has not elapsed
     *   yet; messages in the Update cannot be processed yet
     * - if the timestamp is in the past, this does not necessarily mean that all
     *   messages in the Update have been processed
     *
     * @returns The timestamp at which a message can confirm
     */
    /**
     * Calculates an expected confirmation timestamp from relayed event
     *
     * @returns Timestamp (if any)
     */
    confirmAt(messageHash: string): Promise<Date | undefined>;
    process(): Promise<ContractTransaction>;
    /**
     * Retrieve the replica status of this message.
     *
     * @returns The {@link ReplicaMessageStatus} corresponding to the solidity
     * status of the message.
     */
    replicaStatus(): Promise<ReplicaMessageStatus>;
    /**
     * Checks whether the message has been delivered.
     *
     * @returns true if processed, else false.
     */
    delivered(): Promise<boolean>;
    /**
     * Returns a promise that resolves when the message has been delivered.
     *
     * WARNING: May never resolve. Oftern takes hours to resolve.
     *
     * @param opts Polling options.
     */
    wait(opts?: {
        pollTime?: number;
    }): Promise<void>;
    /**
     * Get the status of a message
     *
     *    0 = dispatched
     *    1 = included
     *    2 = relayed
     *    3 = updated
     *    4 = received
     *    5 = processed
     *
     * @returns An record of all events and correlating txs
     */
    status(): Promise<MessageStatus | undefined>;
    /**
     * The domain from which the message was sent
     */
    get from(): number;
    /**
     * The domain from which the message was sent. Alias for `from`
     */
    get origin(): number;
    /**
     * The name of the domain from which the message was sent
     */
    get originName(): string;
    /**
     * Get the name of this file in the s3 bucket
     */
    get s3Name(): string;
    /**
     * Get the URI for the proof in S3
     */
    get s3Uri(): string | undefined;
    /**
     * The identifier for the sender of this message
     */
    get sender(): string;
    /**
     * The domain nonce for this message
     */
    get nonce(): number;
    /**
     * The destination domain for this message
     */
    get destination(): number;
    /**
     * The identifer for the recipient for this message
     */
    get recipient(): string;
    /**
     * The message body
     */
    get body(): string;
    /**
     * The keccak256 hash of the message body
     */
    get bodyHash(): string;
    /**
     * The hash of the transaction that dispatched this message
     */
    get transactionHash(): string;
    /**
     * The messageHash committed to the tree in the Home contract.
     */
    get leaf(): string;
    /**
     * The index of the leaf in the contract.
     */
    get leafIndex(): BigNumber;
    /**
     * The destination and nonceof this message.
     */
    get destinationAndNonce(): BigNumber;
    /**
     * The committed root when this message was dispatched.
     */
    get committedRoot(): string;
    /**
     * Get the proof associated with this message
     *
     * @returns a proof, or undefined if no proof available
     * @throws if s3 is not configured for this env
     */
    getProof(): Promise<MessageProof | undefined>;
}
//# sourceMappingURL=NomadMessage.d.ts.map