import { BigNumber, Contract, ContractTransaction } from 'ethers';
import { FacetCut } from './diamond';
import { DiamondStandardsConfig, InitializationConfig } from './config';
export type PromiseOrValue<T> = T | Promise<T>;
export declare enum FacetCutAction {
    Add = 0,
    Replace = 1,
    Remove = 2
}
export interface UpgradeDetailsStruct {
    moduleAddress: string;
    action: number;
    selectors: string[];
}
export interface TransactionConfig {
    gasLimit?: string;
    gasPrice?: string;
    maxFeePerGas?: string;
    maxPriorityFeePerGas?: string;
}
export interface IUpgradeService extends Contract {
    diamondCut(cuts: FacetCut[], init: string, calldata: string): Promise<ContractTransaction>;
    versionedUpgrade(upgradeDetails: UpgradeDetailsStruct[], currentVersion: string, newVersion: string, txConfig?: TransactionConfig): Promise<ContractTransaction>;
    functions: {
        [key: string]: (...args: any[]) => Promise<any>;
        diamondCut: (cuts: FacetCut[], init: string, calldata: string) => Promise<ContractTransaction>;
        versionedUpgrade: (upgradeDetails: UpgradeDetailsStruct[], currentVersion: string, newVersion: string, txConfig?: TransactionConfig) => Promise<ContractTransaction>;
    };
}
export interface UpgradeActionResult {
    gasUsed: BigNumber;
    transactionHash: string;
    successCount: number;
    failedSelectors: string[];
    retryAttempts?: Array<RetryAttempt>;
    results?: {
        added: string[];
        replaced: string[];
        removed: string[];
        failed: string[];
    };
}
export interface ModuleUpgradeResult {
    moduleName: string;
    deployedAddress: string;
    originalAction: number;
    wasRetried: boolean;
    retryAction?: number;
    retrySuccess?: boolean;
    deploymentTime: string;
    gasUsed: string;
    costInEth: string;
    functions: {
        signature: string;
        selector: string;
        status: string;
    }[];
    error?: string;
}
export interface UpgradeContext {
    startTime: number;
    moduleResults: ModuleUpgradeResult[];
    totalGasUsed: BigNumber;
    successfulModules: number;
    successfulSelectors: number;
    failedUpgrades: Array<{
        module: string;
        selectors: string[];
        error: string;
    }>;
}
export interface RetryAttempt {
    selector: string;
    originalAction: string;
    retryAction: string;
    success: boolean;
    gasUsed: string;
    error?: string;
}
export interface DopStickConfig {
    paths: {
        typechain: string;
        upgrades: string;
    };
    contracts: {
        upgradeService: {
            name: string;
            path?: string;
        };
        diamond: {
            address: string;
            name: string;
            standards?: DiamondStandardsConfig;
        };
        diamondCut: {
            name: string;
        };
    };
    gas: {
        maxRetries: number;
        maxFeePerGas: string;
        maxPriorityFeePerGas: string;
    };
    security: {
        ownershipValidation: boolean;
        selectorCollisionCheck: boolean;
        facetAddressValidation: boolean;
        estimateGasBeforeUpgrade: boolean;
    };
    initialization: InitializationConfig;
}
//# sourceMappingURL=contracts.d.ts.map