import { StorageLayout, ValidationDataCurrent, ValidationOptions, Version } from '@openzeppelin/upgrades-core';
import type { EthereumProvider } from 'hardhat/types/providers';
import type { ContractInfo, DeployedContract, EngineBinding } from './binding.js';
import { StandaloneOptions, UpgradeOptions } from './options.js';
export interface DeployedImpl {
    impl: string;
    /** The implementation deployment record, used by the bindings to expose a transaction response. */
    deployment: DeployedContract;
}
export interface DeployedProxyImpl extends DeployedImpl {
    kind: NonNullable<ValidationOptions['kind']>;
}
export interface DeployData {
    provider: EthereumProvider;
    validations: ValidationDataCurrent;
    unlinkedBytecode: string;
    encodedArgs: string;
    version: Version;
    layout: StorageLayout;
    fullOpts: Required<UpgradeOptions>;
}
export declare function getDeployData(binding: EngineBinding, info: ContractInfo, opts: UpgradeOptions): Promise<DeployData>;
export declare function deployUpgradeableImpl(binding: EngineBinding, info: ContractInfo, opts: StandaloneOptions, currentImplAddress: string | undefined): Promise<DeployedImpl>;
export declare function deployProxyImpl(binding: EngineBinding, info: ContractInfo, opts: UpgradeOptions, proxyAddress: string | undefined): Promise<DeployedProxyImpl>;
export declare function deployBeaconImpl(binding: EngineBinding, info: ContractInfo, opts: UpgradeOptions, beaconAddress: string | undefined): Promise<DeployedImpl>;
/**
 * To import an already deployed contract we reuse fetchOrDeploy for its ability to validate a
 * deployment and record it in the network file, by "simulating" a deployment: the deploy callback
 * simply returns the contract to be imported rather than deploying anything.
 */
export declare function simulateDeployImpl(binding: EngineBinding, info: ContractInfo, opts: UpgradeOptions, implAddress: string): Promise<void>;
//# sourceMappingURL=deploy-impl.d.ts.map