import { Address, HexString } from '@hyperlane-xyz/utils';
import type { ChainMetadata } from '../metadata/chainMetadataTypes.js';
import type { ChainMap, ChainName, ChainNameOrId } from '../types.js';
import { MinimalProviderRegistry, MinimalProviderRegistryOptions } from './MinimalProviderRegistry.js';
import { MultiProvider, MultiProviderOptions } from './MultiProvider.js';
import { ProviderType, TypedTransaction, TypedProvider } from './ProviderType.js';
import { TransactionFeeEstimate } from './transactionFeeEstimators.js';
export interface MultiProviderAdapterOptions extends MinimalProviderRegistryOptions {
}
export declare function wrapMultiProviderProviders<MetaExt = {}>(chainMetadata: ChainMap<ChainMetadata<MetaExt>>, providers: MultiProvider<MetaExt>['providers']): ChainMap<TypedProvider>;
export declare function createAdapterFromMultiProvider<MetaExt = {}, TOptions extends MultiProviderAdapterOptions = MultiProviderAdapterOptions, TAdapter extends MultiProviderAdapter<MetaExt> = MultiProviderAdapter<MetaExt>>(AdapterClass: new (chainMetadata: ChainMap<ChainMetadata<MetaExt>>, options?: TOptions) => TAdapter, mp: MultiProvider<MetaExt>, options?: TOptions): TAdapter;
export declare class MultiProviderAdapter<MetaExt = {}> extends MinimalProviderRegistry<MetaExt> {
    protected readonly options: MultiProviderAdapterOptions;
    protected getDefaultProviderType(chainNameOrId: ChainNameOrId): ProviderType | undefined;
    constructor(chainMetadata: ChainMap<ChainMetadata<MetaExt>>, options?: MultiProviderAdapterOptions);
    static fromMultiProvider<MetaExt = {}>(mp: MultiProvider<MetaExt>, options?: MultiProviderAdapterOptions): MultiProviderAdapter<MetaExt>;
    tryGetProvider(chainNameOrId: ChainNameOrId, type?: ProviderType): TypedProvider | null;
    toMultiProvider(options?: MultiProviderOptions): MultiProvider<MetaExt>;
    extendChainMetadata<NewExt = {}>(additionalMetadata: ChainMap<NewExt>): MultiProviderAdapter<MetaExt & NewExt>;
    intersect(chains: ChainName[], throwIfNotSubset?: boolean): {
        intersection: ChainName[];
        result: MultiProviderAdapter<MetaExt>;
    };
    estimateTransactionFee({ chainNameOrId, transaction, sender, senderPubKey, }: {
        chainNameOrId: ChainNameOrId;
        transaction: TypedTransaction;
        sender: Address;
        senderPubKey?: HexString;
    }): Promise<TransactionFeeEstimate>;
}
//# sourceMappingURL=MultiProviderAdapter.d.ts.map