import { ChainId } from "@certusone/wormhole-sdk";
import * as anchor from "@project-serum/anchor";
import { AnchorProvider, web3 } from "@project-serum/anchor";
import { PublicKey } from "@solana/web3.js";
import { CancelTokenStreamPayload, DirectTokenTransferPayload, InstantTokenTransferPayload, PauseTokenStreamPayload, TokenDepositPayload, TokenStreamPayload, TokenStreamUpdatePayload, TokenWithdrawPayload, TokenWithdrawStreamPayload } from "../parser";
/**
 * Response type for zebec sol bridge client
 */
export declare type ClientResult = {
    status: "success" | "error";
    message: string;
    data?: {
        signatures: string[];
        dataAccount?: string;
        transactionAccount?: string;
    };
};
export interface IZebecSolBridgeClient {
    /**
     * Intializes config account
     * @param feePayer fee payer for config account
     */
    initialize(feePayer: PublicKey): Promise<string>;
    /**
     * Registers xchain emitters to retreive vaa emitted.
     * @param emitterAddress xchain emitter's hex address
     * @param emitterChain chain id where xchain emitter is deployed
     */
    registerEmitterAddress(emitterAddress: string, emitterChain: ChainId): Promise<string>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for deposit token
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    depositToken(vaa: Uint8Array, payload: TokenDepositPayload): Promise<ClientResult>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for withdraw deposited token
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    withdrawDeposit(vaa: Uint8Array, payload: TokenWithdrawPayload): Promise<ClientResult>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for start token stream
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    initializeStream(vaa: Uint8Array, payload: TokenStreamPayload): Promise<ClientResult>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for withdraw streamed token
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    withdrawStreamToken(vaa: Uint8Array, payload: TokenWithdrawStreamPayload): Promise<ClientResult>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for update token stream
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    updateStreamToken(vaa: Uint8Array, payload: TokenStreamUpdatePayload): Promise<ClientResult>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for cancel token stream
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    cancelStream(vaa: Uint8Array, payload: CancelTokenStreamPayload): Promise<ClientResult>;
    /**
     * Calls solana zebec bridge program to make cpi to zebec program for pause or resume token stream
     * @param vaa Signed vaa array
     * @param payload Payload for token deposit
     */
    pauseResumeStream(vaa: Uint8Array, payload: PauseTokenStreamPayload): Promise<ClientResult>;
    /**
     * Transfers token from user's zebec vault to specified receiver.
     * @param vaa Signed vaa array
     * @param payload Payload for token transfer
     */
    instantTokenTransfer(vaa: Uint8Array, payload: InstantTokenTransferPayload): Promise<ClientResult>;
}
export declare class ZebecSolBridgeClient implements IZebecSolBridgeClient {
    private readonly _bridgeProgram;
    private readonly _zebecProgram;
    private readonly _provider;
    private static readonly ZebecProgramId;
    private readonly _transactions;
    private readonly _zebecInstructions;
    /**
     * Bridge program id of zebec sol bridge client
     */
    static readonly BridgeProgramId: PublicKey;
    constructor(provider: AnchorProvider);
    /**
     * Gets solana address for xchain user accounts
     * @param address xchain user address
     * @param chainId source chain id of xchain user
     * @deprecated
     * This method is to going to be removed soon. Transfer funds from accounts
     * created using this methods to other accounts.
     * Use `getProxyUserKey` instead.
     */
    static getXChainUserKey(address: Uint8Array, chainId: ChainId): PublicKey;
    /**
     * Gets proxy solana account for xchain user address
     * @param address address of xchain user other than solana
     * @param chainId chain id of xchain user
     */
    static getProxyUserKey(address: string | Uint8Array, chainId: ChainId): PublicKey;
    /**
     * Gets emitter account address for given chain id
     * @param chainId source chain id of emitter
     * @returns
     */
    static getEmitterAccountKey(chainId: ChainId): PublicKey;
    /**
     * Gets process vaa account key
     * @param emitterChain source chain id of emitter chain
     * @param emitterAddress emitter address
     * @param sequence sequence of transaction being emitted
     * @returns
     */
    static getProcessVaaKey(emitterChain: ChainId, emitterAddress: string, sequence: number): Promise<web3.PublicKey>;
    private static parseEmitterAddressHex;
    /**
     * Gets core bridge vaa account address
     * @param timestamp timestamp in vaa
     * @param nonce nonce in vaa
     * @param emitterChain emitter chain id in vaa
     * @param emitterAddress emitter address in vaa
     * @param sequence sequence in vaa
     * @param consistencyLevel consistency level in vaa
     * @param payload payload in vaa
     * @returns
     */
    static getCoreBridgeVaaKey(timestamp: any, nonce: any, emitterChain: any, emitterAddress: any, sequence: any, consistencyLevel: any, payload: any): Promise<anchor.web3.PublicKey>;
    /**
     * Gets config account address
     * @returns
     */
    static getConfigAccountKey(programId?: PublicKey): PublicKey;
    private getDataStoragePda;
    private getTransactionCountKey;
    private getCurrentCount;
    private sendAndConfirm;
    initialize(): Promise<string>;
    registerEmitterAddress(emitterAddress: string, emitterChain: ChainId): Promise<string>;
    depositToken(vaa: Uint8Array, payload: TokenDepositPayload): Promise<ClientResult>;
    withdrawDeposit(vaa: Uint8Array, payload: TokenWithdrawPayload): Promise<ClientResult>;
    initializeStream(vaa: Uint8Array, payload: TokenStreamPayload): Promise<ClientResult>;
    withdrawStreamToken(vaa: Uint8Array, payload: TokenWithdrawStreamPayload): Promise<ClientResult>;
    cancelStream(vaa: Uint8Array, payload: CancelTokenStreamPayload): Promise<ClientResult>;
    pauseResumeStream(vaa: Uint8Array, payload: PauseTokenStreamPayload): Promise<ClientResult>;
    updateStreamToken(vaa: Uint8Array, payload: TokenStreamUpdatePayload): Promise<ClientResult>;
    instantTokenTransfer(vaa: Uint8Array, payload: InstantTokenTransferPayload): Promise<ClientResult>;
    directTokenTransfer(vaa: Uint8Array, payload: DirectTokenTransferPayload): Promise<ClientResult>;
}
