import { ethers } from "ethers";
import { Fragment } from 'ethers/lib/utils';
import { RollbackConfig } from "./rollback";
import { ParallelizationConfig } from './parallelTypes';
import { DiamondStandardType } from '../types/diamond';
export interface BaseUpgradeConfig {
    fail_all_if_one_fails: boolean;
    add_or_replace: boolean;
}
export interface ParamConfig {
    envKey: string;
    name: string;
    type: string;
}
export interface UpgradeModule {
    module: string;
    add?: string[];
    replace?: string[];
    remove?: string[];
}
export interface InitializationConfig {
    enabled?: boolean;
    initializerContract?: string;
    initializerFunction?: string;
    initializerArgs?: any[];
    deployNew?: boolean;
    existingAddress?: string;
    gasLimit?: number;
}
export interface DiamondLoupeFunctionConfig {
    name: string;
    abi?: string | Fragment;
    additionalParams?: {
        name: string;
        type: string;
        envKey: string;
    }[];
}
export interface DiamondLoupeConfig {
    functions?: {
        facets?: string | DiamondLoupeFunctionConfig;
        facetSelectors?: string | DiamondLoupeFunctionConfig;
        facetAddresses?: string | DiamondLoupeFunctionConfig;
        facetAddress?: string | DiamondLoupeFunctionConfig;
        owner?: string | DiamondLoupeFunctionConfig;
        version?: string | DiamondLoupeFunctionConfig;
    };
    returnTypes?: {
        facets?: string;
        selectors?: string;
        addresses?: string;
        address?: string;
    };
}
export interface CoreFacetParamConfig {
    name: string;
    type: string;
    key: string;
    location: 'config' | 'env';
}
export interface CoreFacetFunctionConfig {
    abi?: string | Fragment;
    additionalParams?: CoreFacetParamConfig[];
}
export interface CoreFacetConfig {
    name?: string;
    customFunctions?: {
        [functionName: string]: string | CoreFacetFunctionConfig;
    };
}
export interface DiamondStandardsConfig {
    type?: DiamondStandardType;
    versioning?: {
        enabled?: boolean;
        strategy?: 'semver' | 'incremental' | 'custom';
        format?: string;
        functions?: {
            getVersion?: string;
            getVersionHistory?: string;
        };
    };
    loupe?: CoreFacetConfig & {
        returnTypes?: {
            facets?: string;
            selectors?: string;
            addresses?: string;
            address?: string;
        };
    };
    cut?: CoreFacetConfig & {
        params?: {
            facetCutStructName?: string;
            actionEnumName?: string;
        };
        actions?: {
            add?: number;
            replace?: number;
            remove?: number;
        };
        batchSize?: number;
        retryStrategy?: {
            enabled?: boolean;
            maxAttempts?: number;
            backoffMs?: number;
        };
    };
    init?: CoreFacetConfig & {
        fallbackAddress?: string;
        validation?: {
            validateInit?: boolean;
            requireSuccess?: boolean;
        };
    };
    ownership?: CoreFacetConfig & {
        type?: 'single-step' | 'two-step';
        multiSig?: {
            enabled?: boolean;
            threshold?: number;
            owners?: string[];
        };
    };
    erc165?: CoreFacetConfig & {
        interfaces?: {
            IDiamondCut?: string;
            IDiamondLoupe?: string;
            IERC165?: string;
            IERC173?: string;
        };
        validation?: {
            requireSupport?: string[];
        };
    };
    access?: CoreFacetConfig & {
        type?: 'ownership' | 'roles';
        roles?: {
            admin?: string;
            upgrader?: string;
            pauser?: string;
        };
    };
    emergency?: CoreFacetConfig & {
        enabled?: boolean;
        pausable?: {
            selective?: boolean;
            timeout?: number;
        };
    };
    additionalCoreFacets?: {
        [facetName: string]: CoreFacetConfig & {
            customConfig?: Record<string, any>;
        };
    };
}
export interface CustomFunctionConfig {
    name: string;
    additionalParams?: {
        name: string;
        type: string;
        envKey: string;
    }[];
}
export interface UpgradeServiceConfig {
    name?: string;
    path?: string;
    abi?: Array<string | Fragment>;
    customFunctions?: {
        diamondCut?: string | CustomFunctionConfig;
    };
}
export type UpgradeMode = 'basic' | 'strict' | 'auto-pilot-beta' | 'copilot-beta';
export interface RetryConfig {
    enabled?: boolean;
    maxRetries?: number;
    retryDelay?: number;
    exponentialBackoff?: boolean;
    maxDelay?: number;
    shouldRetry?: (error: Error) => boolean;
}
export interface ReportConfig {
    includeFailedReports?: boolean;
    outputDir?: string;
}
export interface CompilerConfig {
    version?: string;
    name?: string;
    compileCommand?: string;
    skip?: boolean;
    optimization?: {
        enabled?: boolean;
        runs?: number;
    };
}
export interface DopStickConfig {
    compiler?: CompilerConfig;
    mode?: UpgradeMode;
    rollback?: RollbackConfig;
    paths: {
        upgrades: string;
        typechain?: string;
        contracts?: string;
        artifacts?: string;
        cache?: string;
        reports?: string;
    };
    initialization?: InitializationConfig;
    contracts?: {
        diamond?: {
            name?: string;
            standards?: DiamondStandardsConfig;
            compiler?: CompilerConfig;
        };
        upgradeService?: UpgradeServiceConfig;
    };
    security?: {
        ownershipValidation?: boolean;
        selectorCollisionCheck?: boolean;
        facetAddressValidation?: boolean;
        estimateGasBeforeUpgrade?: boolean;
        verifyContracts?: boolean;
    };
    gas?: {
        maxRetries?: number;
        maxFeePerGas?: string;
        maxPriorityFeePerGas?: string;
    };
    parallelization?: ParallelizationConfig;
    retry?: RetryConfig;
    report?: ReportConfig;
    cache?: {
        enabled?: boolean;
    };
    verification?: {
        enabled?: boolean;
        etherscan?: {
            apiKey: string;
            delay?: number;
        };
        sourcify?: {
            enabled: boolean;
        };
    };
}
export interface DiamondConfig {
    provider?: ethers.providers.Provider;
    address?: string;
    network?: string;
    rpcUrl?: string;
}
export interface UpgradeConfig extends BaseUpgradeConfig {
    modules: (string | UpgradeModule)[];
    upgrades?: (string | UpgradeModule)[];
    additionalParams?: {
        [moduleName: string]: {
            [paramKey: string]: any;
        };
    };
}
//# sourceMappingURL=config.d.ts.map