import type { CosmWasmClient, Contract as CosmWasmContract, ExecuteInstruction } from '@cosmjs/cosmwasm-stargate';
import type { EncodeObject as CmTransaction } from '@cosmjs/proto-signing';
import type { DeliverTxResponse, StargateClient } from '@cosmjs/stargate';
import type { Connection, Keypair, Transaction as SolTransaction, VersionedTransactionResponse as SolTransactionReceipt } from '@solana/web3.js';
import type { Contract as EV5Contract, providers as EV5Providers, PopulatedTransaction as EV5Transaction } from 'ethers';
import type { Contract as StarknetContract, Invocation as StarknetInvocation, Provider as StarknetProvider, GetTransactionReceiptResponse as StarknetTxReceipt } from 'starknet';
import type { GetContractReturnType, PublicClient, Transaction as VTransaction, TransactionReceipt as VTransactionReceipt } from 'viem';
import type { Contract as ZKSyncBaseContract, Provider as ZKSyncBaseProvider, types as zkSyncTypes } from 'zksync-ethers';
import type { AleoProvider as AleoSDKProvider, AleoReceipt as AleoSDKReceipt, AleoTransaction as AleoSDKTransaction } from '@hyperlane-xyz/aleo-sdk/runtime';
import type { CosmosNativeProvider } from '@hyperlane-xyz/cosmos-sdk/runtime';
import type { RadixProvider as RadixSDKProvider, RadixSDKReceipt, RadixSDKTransaction } from '@hyperlane-xyz/radix-sdk/runtime';
import type { Annotated, KnownProtocolType } from '@hyperlane-xyz/utils';
import { ProtocolType } from '@hyperlane-xyz/utils';
export declare enum ProviderType {
    EthersV5 = "ethers-v5",
    Viem = "viem",
    SolanaWeb3 = "solana-web3",
    CosmJs = "cosmjs",
    CosmJsNative = "cosmjs-native",
    CosmJsWasm = "cosmjs-wasm",
    GnosisTxBuilder = "gnosis-txBuilder",
    Starknet = "starknet",
    ZkSync = "zksync",
    Radix = "radix",
    Aleo = "aleo",
    Tron = "tron"
}
export type { KnownProtocolType };
export declare const PROTOCOL_TO_DEFAULT_PROVIDER_TYPE: Record<KnownProtocolType, ProviderType>;
export type ProviderMap<Value> = Partial<Record<ProviderType, Value>>;
type ProtocolTypesMapping = {
    [ProtocolType.Ethereum]: {
        transaction: EthersV5Transaction;
        provider: EthersV5Provider;
        contract: EthersV5Contract;
        receipt: EthersV5TransactionReceipt;
    };
    [ProtocolType.Sealevel]: {
        transaction: SolanaWeb3Transaction;
        provider: SolanaWeb3Provider;
        contract: SolanaWeb3Contract;
        receipt: SolanaWeb3TransactionReceipt;
    };
    [ProtocolType.Cosmos]: {
        transaction: CosmJsWasmTransaction;
        provider: CosmJsWasmProvider;
        contract: CosmJsWasmContract;
        receipt: CosmJsWasmTransactionReceipt;
    };
    [ProtocolType.CosmosNative]: {
        transaction: CosmJsNativeTransaction;
        provider: CosmJsNativeProvider;
        contract: null;
        receipt: CosmJsNativeTransactionReceipt;
    };
    [ProtocolType.Starknet]: {
        transaction: StarknetJsTransaction;
        provider: StarknetJsProvider;
        contract: StarknetJsContract;
        receipt: StarknetJsTransactionReceipt;
    };
    [ProtocolType.Radix]: {
        transaction: RadixTransaction;
        provider: RadixProvider;
        contract: null;
        receipt: RadixTransactionReceipt;
    };
    [ProtocolType.Aleo]: {
        transaction: AleoTransaction;
        provider: AleoProvider;
        contract: null;
        receipt: AleoTransactionReceipt;
    };
    [ProtocolType.Tron]: {
        transaction: EthersV5Transaction;
        provider: TronProvider;
        contract: null;
        receipt: EthersV5TransactionReceipt;
    };
    [ProtocolType.Unknown]: {
        transaction: never;
        provider: never;
        contract: never;
        receipt: never;
    };
};
type ProtocolTyped<T extends ProtocolType, K extends keyof ProtocolTypesMapping[T]> = ProtocolTypesMapping[T][K];
export type ProtocolTypedTransaction<T extends ProtocolType> = ProtocolTyped<T, 'transaction'>;
export type ProtocolTypedProvider<T extends ProtocolType> = ProtocolTyped<T, 'provider'>;
export type ProtocolTypedContract<T extends ProtocolType> = ProtocolTyped<T, 'contract'>;
export type ProtocolTypedReceipt<T extends ProtocolType> = ProtocolTyped<T, 'receipt'>;
export type AnyProtocolTransaction = ProtocolTransaction<ProtocolType>;
export type ProtocolTransaction<T extends ProtocolType> = ProtocolTypedTransaction<T>['transaction'];
export type AnyProtocolReceipt = ProtocolReceipt<ProtocolType>;
export type ProtocolReceipt<T extends ProtocolType> = ProtocolTypedReceipt<T>['receipt'];
export type AnnotatedTypedTransaction<T extends ProtocolType> = Annotated<ProtocolTransaction<T>>;
/**
 * Providers with discriminated union of type
 */
interface TypedProviderBase<T> {
    type: ProviderType;
    provider: T;
}
export interface EthersV5Provider extends TypedProviderBase<EV5Providers.Provider> {
    type: ProviderType.EthersV5;
    provider: EV5Providers.Provider;
}
export interface ViemProvider extends TypedProviderBase<PublicClient> {
    type: ProviderType.Viem;
    provider: PublicClient;
}
export interface SolanaWeb3Provider extends TypedProviderBase<Connection> {
    type: ProviderType.SolanaWeb3;
    provider: Connection;
}
export interface CosmJsProvider extends TypedProviderBase<Promise<StargateClient>> {
    type: ProviderType.CosmJs;
    provider: Promise<StargateClient>;
}
export interface CosmJsWasmProvider extends TypedProviderBase<Promise<CosmWasmClient>> {
    type: ProviderType.CosmJsWasm;
    provider: Promise<CosmWasmClient>;
}
export interface CosmJsNativeProvider extends TypedProviderBase<Promise<CosmosNativeProvider>> {
    type: ProviderType.CosmJsNative;
    provider: Promise<CosmosNativeProvider>;
}
export interface StarknetJsProvider extends TypedProviderBase<StarknetProvider> {
    type: ProviderType.Starknet;
    provider: StarknetProvider;
}
export interface RadixProvider extends TypedProviderBase<RadixSDKProvider> {
    type: ProviderType.Radix;
    provider: RadixSDKProvider;
}
export interface AleoProvider extends TypedProviderBase<AleoSDKProvider> {
    type: ProviderType.Aleo;
    provider: AleoSDKProvider;
}
export interface TronProvider extends TypedProviderBase<EV5Providers.Provider> {
    type: ProviderType.Tron;
    provider: EV5Providers.Provider;
}
export interface ZKSyncProvider extends TypedProviderBase<ZKSyncBaseProvider> {
    type: ProviderType.ZkSync;
    provider: ZKSyncBaseProvider;
}
export interface GnosisTxBuilderProvider extends TypedProviderBase<EV5Providers.Provider> {
    type: ProviderType.GnosisTxBuilder;
    provider: EV5Providers.Provider;
}
export type TypedProvider = EthersV5Provider | ViemProvider | SolanaWeb3Provider | CosmJsProvider | CosmJsWasmProvider | CosmJsNativeProvider | StarknetJsProvider | ZKSyncProvider | GnosisTxBuilderProvider | RadixProvider | AleoProvider | TronProvider;
/**
 * Contracts with discriminated union of provider type
 */
interface TypedContractBase<T> {
    type: ProviderType;
    contract: T;
}
export interface EthersV5Contract extends TypedContractBase<EV5Contract> {
    type: ProviderType.EthersV5;
    contract: EV5Contract;
}
export interface ViemContract extends TypedContractBase<GetContractReturnType> {
    type: ProviderType.Viem;
    contract: GetContractReturnType;
}
export interface SolanaWeb3Contract extends TypedContractBase<never> {
    type: ProviderType.SolanaWeb3;
    contract: never;
}
export interface CosmJsContract extends TypedContractBase<never> {
    type: ProviderType.CosmJs;
    contract: never;
}
export interface CosmJsWasmContract extends TypedContractBase<CosmWasmContract> {
    type: ProviderType.CosmJsWasm;
    contract: CosmWasmContract;
}
export interface StarknetJsContract extends TypedContractBase<StarknetContract> {
    type: ProviderType.Starknet;
    contract: StarknetContract;
}
export interface ZKSyncContract extends TypedContractBase<ZKSyncBaseContract> {
    type: ProviderType.ZkSync;
    contract: ZKSyncBaseContract;
}
export type TypedContract = EthersV5Contract | ViemContract | SolanaWeb3Contract | CosmJsContract | CosmJsWasmContract | StarknetJsContract | ZKSyncBaseContract;
/**
 * Transactions with discriminated union of provider type
 */
interface TypedTransactionBase<T> {
    type: ProviderType;
    transaction: T;
}
export interface EthersV5Transaction extends TypedTransactionBase<EV5Transaction> {
    type: ProviderType.EthersV5;
    transaction: EV5Transaction;
}
export interface ViemTransaction extends TypedTransactionBase<VTransaction> {
    type: ProviderType.Viem;
    transaction: VTransaction;
}
export interface SolanaWeb3Transaction extends TypedTransactionBase<SolTransaction> {
    type: ProviderType.SolanaWeb3;
    transaction: SolTransaction;
    extraSigners?: Keypair[];
}
export interface CosmJsTransaction extends TypedTransactionBase<CmTransaction> {
    type: ProviderType.CosmJs;
    transaction: CmTransaction;
}
export interface CosmJsWasmTransaction extends TypedTransactionBase<ExecuteInstruction> {
    type: ProviderType.CosmJsWasm;
    transaction: ExecuteInstruction;
}
export interface CosmJsNativeTransaction extends TypedTransactionBase<CmTransaction> {
    type: ProviderType.CosmJsNative;
    transaction: CmTransaction;
}
export interface StarknetJsTransaction extends TypedTransactionBase<StarknetInvocation> {
    type: ProviderType.Starknet;
    transaction: StarknetInvocation;
}
export interface RadixTransaction extends TypedTransactionBase<RadixSDKTransaction> {
    type: ProviderType.Radix;
    transaction: RadixSDKTransaction;
}
export interface AleoTransaction extends TypedTransactionBase<AleoSDKTransaction> {
    type: ProviderType.Aleo;
    transaction: AleoSDKTransaction;
}
export interface ZKSyncTransaction extends TypedTransactionBase<zkSyncTypes.TransactionRequest> {
    type: ProviderType.ZkSync;
    transaction: zkSyncTypes.TransactionRequest;
}
export interface TronTransaction extends TypedTransactionBase<EV5Transaction> {
    type: ProviderType.Tron;
    transaction: EV5Transaction;
}
export type TypedTransaction = EthersV5Transaction | ViemTransaction | SolanaWeb3Transaction | CosmJsTransaction | CosmJsWasmTransaction | CosmJsNativeTransaction | StarknetJsTransaction | ZKSyncTransaction | RadixTransaction | AleoTransaction | TronTransaction;
export type AnnotatedEV5Transaction = Annotated<EV5Transaction>;
export type AnnotatedViemTransaction = Annotated<VTransaction>;
export type AnnotatedSolanaWeb3Transaction = Annotated<SolTransaction>;
export type AnnotatedCosmJsTransaction = Annotated<CmTransaction>;
export type AnnotatedCosmJsWasmTransaction = Annotated<ExecuteInstruction>;
export type AnnotatedCosmJsNativeTransaction = Annotated<CmTransaction>;
export type AnnotatedStarknetJsTransaction = Annotated<StarknetInvocation>;
export type AnnotatedZKSyncTransaction = Annotated<zkSyncTypes.TransactionRequest>;
export type AnnotatedRadixTransaction = Annotated<RadixSDKTransaction>;
export type AnnotatedTronTransaction = Annotated<EV5Transaction>;
export type TypedAnnotatedTransaction = AnnotatedEV5Transaction | AnnotatedViemTransaction | AnnotatedSolanaWeb3Transaction | AnnotatedCosmJsTransaction | AnnotatedCosmJsWasmTransaction | AnnotatedCosmJsNativeTransaction | AnnotatedStarknetJsTransaction | AnnotatedZKSyncTransaction | AnnotatedRadixTransaction | AnnotatedTronTransaction;
/**
 * Transaction receipt/response with discriminated union of provider type
 */
interface TypedTransactionReceiptBase<T> {
    type: ProviderType;
    receipt: T;
}
export interface EthersV5TransactionReceipt extends TypedTransactionReceiptBase<EV5Providers.TransactionReceipt> {
    type: ProviderType.EthersV5;
    receipt: EV5Providers.TransactionReceipt;
}
export interface ViemTransactionReceipt extends TypedTransactionReceiptBase<VTransactionReceipt> {
    type: ProviderType.Viem;
    receipt: VTransactionReceipt;
}
export interface SolanaWeb3TransactionReceipt extends TypedTransactionReceiptBase<SolTransactionReceipt> {
    type: ProviderType.SolanaWeb3;
    receipt: SolTransactionReceipt;
}
export interface CosmJsTransactionReceipt extends TypedTransactionReceiptBase<DeliverTxResponse> {
    type: ProviderType.CosmJs;
    receipt: DeliverTxResponse;
}
export interface CosmJsWasmTransactionReceipt extends TypedTransactionReceiptBase<DeliverTxResponse> {
    type: ProviderType.CosmJsWasm;
    receipt: DeliverTxResponse;
}
export interface CosmJsNativeTransactionReceipt extends TypedTransactionReceiptBase<DeliverTxResponse> {
    type: ProviderType.CosmJsNative;
    receipt: DeliverTxResponse;
}
export interface StarknetJsTransactionReceipt extends TypedTransactionReceiptBase<StarknetTxReceipt> {
    type: ProviderType.Starknet;
    receipt: StarknetTxReceipt;
}
export interface ZKSyncTransactionReceipt extends TypedTransactionReceiptBase<zkSyncTypes.TransactionReceipt> {
    type: ProviderType.ZkSync;
    receipt: zkSyncTypes.TransactionReceipt;
}
export interface RadixTransactionReceipt extends TypedTransactionReceiptBase<RadixSDKReceipt> {
    type: ProviderType.Radix;
    receipt: RadixSDKReceipt;
}
export interface AleoTransactionReceipt extends TypedTransactionReceiptBase<AleoSDKReceipt> {
    type: ProviderType.Aleo;
    receipt: AleoSDKReceipt;
}
export interface TronTransactionReceipt extends TypedTransactionReceiptBase<EV5Providers.TransactionReceipt> {
    type: ProviderType.Tron;
    receipt: EV5Providers.TransactionReceipt;
}
export type TypedTransactionReceipt = EthersV5TransactionReceipt | ViemTransactionReceipt | SolanaWeb3TransactionReceipt | CosmJsTransactionReceipt | CosmJsWasmTransactionReceipt | CosmJsNativeTransactionReceipt | StarknetJsTransactionReceipt | ZKSyncTransactionReceipt | RadixTransactionReceipt | AleoTransactionReceipt | TronTransactionReceipt;
//# sourceMappingURL=ProviderType.d.ts.map