import { type Address, type Chain, type ChainContract, type Hex, type Narrow, type Prettify, type PublicClient, type Transport } from "viem";
import type { GovernanceToken } from "../definitions/governance.js";
import type { ChainLinkOracleContractReturnType, ComptrollerContractReturnType, CoreRouterContractReturnType, CoreViewsContractReturnType, GovernanceTokenContractReturnType, GovernorContractReturnType, MarketTokenContractReturnType, MaximillionContractReturnType, MorphoBlueContractReturnType, MorphoBundlerContractReturnType, MorphoPublicAllocatorContractReturnType, MorphoVaultContractReturnType, MorphoViewsContractReturnType, MultiRewardDistributorContractReturnType, MultichainGovernorContractReturnType, StakingTokenContractReturnType, TemporalGovernorContractReturnType, TokenContractReturnType, TokenSaleContractReturnType, VoteCollectorContractReturnType, WrappedNativeTokenContractReturnType } from "./contracts.js";
export type TokenConfig = {
    address: `0x${string}`;
    decimals: number;
    name: string;
    symbol: string;
};
export type VaultConfig<tokens> = {
    vaultToken: keyof tokens;
    underlyingToken: keyof tokens;
    multiReward?: Address;
};
export type MarketConfig<tokens> = {
    marketToken: keyof tokens;
    underlyingToken: keyof tokens;
    deprecated?: boolean;
    badDebt?: boolean;
};
export type MorphoMarketConfig<tokens> = {
    collateralToken: keyof tokens;
    loanToken: keyof tokens;
    id: Hex;
    deprecated?: boolean;
};
export type ContractConfig<tokens> = {
    stakingToken?: keyof tokens;
    governanceToken?: keyof tokens;
    wrappedNativeToken?: keyof tokens;
    comptroller?: Address;
    maximillion?: Address;
    views?: Address;
    tokenSale?: Address;
    morphoViews?: Address;
    multiRewardDistributor?: Address;
    temporalGovernor?: Address;
    voteCollector?: Address;
    governor?: Address;
    multichainGovernor?: Address;
    oracle?: Address;
    router?: Address;
    morphoBlue?: Address;
    morphoBaseBundler?: Address;
    morphoBundler?: Address;
    morphoPublicAllocator?: Address;
};
export type ContractsConfigReturnType = {
    stakingToken: TokenContractReturnType;
    governanceToken: TokenContractReturnType;
    wrappedNativeToken: TokenContractReturnType;
    comptroller: ComptrollerContractReturnType;
    maximillion: MaximillionContractReturnType;
    views: CoreViewsContractReturnType;
    tokenSale: TokenSaleContractReturnType;
    morphoViews: MorphoViewsContractReturnType;
    multiRewardDistributor: MultiRewardDistributorContractReturnType;
    temporalGovernor: TemporalGovernorContractReturnType;
    voteCollector: VoteCollectorContractReturnType;
    governor: GovernorContractReturnType;
    multichainGovernor: MultichainGovernorContractReturnType;
    oracle: ChainLinkOracleContractReturnType;
    router: CoreRouterContractReturnType;
    morphoBlue: MorphoBlueContractReturnType;
    morphoBaseBundler: MorphoBundlerContractReturnType;
    morphoBundler: MorphoBundlerContractReturnType;
    morphoPublicAllocator: MorphoPublicAllocatorContractReturnType;
};
export type CustomConfigType = {
    morpho?: {
        minimalDeployment?: boolean;
        subgraphUrl?: string;
    };
    governance?: {
        token: GovernanceToken;
        chainIds: number[];
        proposalIdOffset?: number;
        snapshotEnsName?: string;
    };
    multiRewarder?: {
        rewardToken: string;
    }[];
    wormhole?: {
        chainId: number;
        tokenBridge?: ChainContract | undefined;
    };
    socket?: {
        gateway?: ChainContract | undefined;
    };
    xWELL?: {
        bridgeAdapter?: ChainContract | undefined;
    };
};
export type GetContractConfig<tokens, contract> = contract extends {} ? contract : keyof tokens;
export type TokensConfig<tokens> = {} extends tokens ? {} : {
    [tokenName in keyof tokens]: TokenConfig;
};
export type VaultsConfig<vaults, tokens> = {} extends vaults ? {} : {
    [name in keyof tokens]?: VaultConfig<tokens>;
};
export type MarketsConfig<markets, tokens> = {} extends markets ? {} : {
    [name in keyof tokens]?: MarketConfig<tokens>;
};
export type MorphoMarketsConfig<markets, tokens> = {} extends markets ? {} : {
    [name in keyof markets]: MorphoMarketConfig<tokens>;
};
export type ContractsConfig<contracts, tokens> = {} extends contracts ? {} : {
    [name in keyof ContractConfig<tokens>]?: ContractConfig<tokens>[name];
};
export type CustomConfig<custom> = {} extends custom ? {} : {
    [name in keyof CustomConfigType]?: CustomConfigType[name];
};
export declare const createTokenConfig: <const tokens>(tokens: TokensConfig<Narrow<tokens>>) => Prettify<tokens>;
export declare const createVaultConfig: <const tokens, const vaults>(config: {
    tokens: TokensConfig<tokens>;
    vaults: VaultsConfig<vaults, tokens>;
}) => Prettify<vaults>;
export declare const createMarketConfig: <const tokens, const markets>(config: {
    tokens: TokensConfig<tokens>;
    markets: MarketsConfig<markets, tokens>;
}) => Prettify<markets>;
export declare const createMorphoMarketConfig: <const tokens, const markets>(config: {
    tokens: TokensConfig<tokens>;
    markets: MorphoMarketsConfig<markets, tokens>;
}) => Prettify<markets>;
export declare const createContractsConfig: <const tokens, const contracts>(config: {
    tokens: TokensConfig<tokens>;
    contracts: ContractsConfig<contracts, tokens>;
}) => Prettify<contracts>;
export declare const createCustomConfig: <custom>(custom: CustomConfig<custom>) => Prettify<custom>;
export declare const createEnvironmentConfig: <tokens, markets, vaults, morphoMarkets, contracts, custom>(config: {
    key: string;
    name: string;
    chain: Chain;
    transport: Transport;
    indexerUrl: string;
    governanceIndexerUrl: string;
    tokens: TokensConfig<tokens>;
    markets: MarketsConfig<markets, tokens>;
    vaults: VaultsConfig<vaults, tokens>;
    morphoMarkets: MorphoMarketsConfig<morphoMarkets, tokens>;
    contracts: ContractsConfig<contracts, tokens>;
    custom: CustomConfig<custom>;
}) => Environment<tokens, markets, vaults, contracts, custom>;
export type Environment<tokens = any, markets = any, vaults = any, contracts = Partial<ContractsConfigReturnType>, custom = CustomConfigType> = {
    key: string;
    name: string;
    chainId: number;
    chain: Chain;
    indexerUrl: string;
    governanceIndexerUrl: string;
    tokens: {
        [name in keyof tokens]: TokenContractReturnType;
    };
    markets: {
        [name in keyof markets]: MarketTokenContractReturnType;
    };
    vaults: {
        [name in keyof vaults]: MorphoVaultContractReturnType;
    };
    contracts: Prettify<{
        [name in keyof contracts as Extract<name, "stakingToken">]: StakingTokenContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "wrappedNativeToken">]: WrappedNativeTokenContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "governanceToken">]: GovernanceTokenContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "comptroller">]: ComptrollerContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "maximillion">]: MaximillionContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "views">]: CoreViewsContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "tokenSale">]: TokenSaleContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "morphoViews">]: MorphoViewsContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "multiRewardDistributor">]: MultiRewardDistributorContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "temporalGovernor">]: TemporalGovernorContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "voteCollector">]: VoteCollectorContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "governor">]: GovernorContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "multichainGovernor">]: MultichainGovernorContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "oracle">]: ChainLinkOracleContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "router">]: CoreRouterContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "morphoBlue">]: MorphoBlueContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "morphoBundler">]: MorphoBundlerContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "morphoBaseBundler">]: MorphoBundlerContractReturnType;
    } & {
        [name in keyof contracts as Extract<name, "morphoPublicAllocator">]: MorphoPublicAllocatorContractReturnType;
    }>;
    custom: custom;
    config: {
        tokens: {
            [name in keyof tokens]: TokenConfig;
        };
        markets: {
            [name in keyof markets]: MarketConfig<Record<string, any>>;
        };
        vaults: {
            [name in keyof vaults]: VaultConfig<Record<string, any>>;
        };
        morphoMarkets: {
            [id: string]: MorphoMarketConfig<Record<string, any>>;
        };
        contracts: ContractConfig<Record<string, any>>;
    };
    publicClient: PublicClient;
};
//# sourceMappingURL=config.d.ts.map