diff --git a/packages/plugin-hardhat/src/deploy-proxy.ts b/packages/plugin-hardhat/src/deploy-proxy.ts index 4f9976fcc..ebdaa184c 100644 --- a/packages/plugin-hardhat/src/deploy-proxy.ts +++ b/packages/plugin-hardhat/src/deploy-proxy.ts @@ -13,7 +13,7 @@ import { import { getProxyFactory, getProxyAdminFactory } from './proxy-factory'; import { readValidations } from './validations'; -import { deploy } from './utils/deploy'; +import { defaultDeploy, TxExecutor } from './utils/deploy'; export interface DeployFunction { (ImplFactory: ContractFactory, args?: unknown[], opts?: DeployOptions): Promise; @@ -22,6 +22,7 @@ export interface DeployFunction { export interface DeployOptions extends ValidationOptions { initializer?: string | false; + executor?: TxExecutor; } export function makeDeployProxy(hre: HardhatRuntimeEnvironment): DeployFunction { @@ -35,6 +36,7 @@ export function makeDeployProxy(hre: HardhatRuntimeEnvironment): DeployFunction args = []; } + const deploy = opts.executor || defaultDeploy; const { provider } = hre.network; const validations = await readValidations(hre); @@ -43,17 +45,17 @@ export function makeDeployProxy(hre: HardhatRuntimeEnvironment): DeployFunction assertUpgradeSafe(validations, version, opts); const impl = await fetchOrDeploy(version, provider, async () => { - const deployment = await deploy(ImplFactory); + const deployment = await deploy(ImplFactory, []); const layout = getStorageLayout(validations, version); return { ...deployment, layout }; }); const AdminFactory = await getProxyAdminFactory(hre, ImplFactory.signer); - const adminAddress = await fetchOrDeployAdmin(provider, () => deploy(AdminFactory)); + const adminAddress = await fetchOrDeployAdmin(provider, async () => await deploy(AdminFactory, [])); const data = getInitializerData(ImplFactory, args, opts.initializer); const ProxyFactory = await getProxyFactory(hre, ImplFactory.signer); - const proxy = await ProxyFactory.deploy(impl, adminAddress, data); + const proxy = await deploy(ProxyFactory, [impl, adminAddress, data]); const inst = ImplFactory.attach(proxy.address); // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/packages/plugin-hardhat/src/upgrade-proxy.ts b/packages/plugin-hardhat/src/upgrade-proxy.ts index 3c6644288..e3e759109 100644 --- a/packages/plugin-hardhat/src/upgrade-proxy.ts +++ b/packages/plugin-hardhat/src/upgrade-proxy.ts @@ -16,18 +16,22 @@ import { import { getProxyAdminFactory } from './proxy-factory'; import { readValidations } from './validations'; -import { deploy } from './utils/deploy'; +import { defaultDeploy, TxExecutor } from './utils/deploy'; + +export interface UpgradeOptions extends ValidationOptions { + executor?: TxExecutor; +} export type PrepareUpgradeFunction = ( proxyAddress: string, ImplFactory: ContractFactory, - opts?: ValidationOptions, + opts?: UpgradeOptions, ) => Promise; export type UpgradeFunction = ( proxyAddress: string, ImplFactory: ContractFactory, - opts?: ValidationOptions, + opts?: UpgradeOptions, ) => Promise; async function prepareUpgradeImpl( @@ -35,8 +39,9 @@ async function prepareUpgradeImpl( manifest: Manifest, proxyAddress: string, ImplFactory: ContractFactory, - opts: ValidationOptions, + opts: UpgradeOptions, ): Promise { + const deploy = opts.executor || defaultDeploy; const { provider } = hre.network; const validations = await readValidations(hre); @@ -51,7 +56,7 @@ async function prepareUpgradeImpl( assertStorageUpgradeSafe(deployment.layout, layout, opts.unsafeAllowCustomTypes); return await fetchOrDeploy(version, provider, async () => { - const deployment = await deploy(ImplFactory); + const deployment = await deploy(ImplFactory, []); return { ...deployment, layout }; }); } diff --git a/packages/plugin-hardhat/src/utils/deploy.ts b/packages/plugin-hardhat/src/utils/deploy.ts index 5a078685b..79c224981 100644 --- a/packages/plugin-hardhat/src/utils/deploy.ts +++ b/packages/plugin-hardhat/src/utils/deploy.ts @@ -1,8 +1,11 @@ -import type { Deployment } from '@openzeppelin/upgrades-core'; import type { ContractFactory } from 'ethers'; +import type { Deployment } from '@openzeppelin/upgrades-core'; +export interface TxExecutor { + (factory: ContractFactory, args: unknown[]): Promise; +} -export async function deploy(factory: ContractFactory): Promise { - const { address, deployTransaction } = await factory.deploy(); +export async function defaultDeploy(factory: ContractFactory, args: unknown[]): Promise { + const { address, deployTransaction } = await factory.deploy(...args); const txHash = deployTransaction.hash; return { address, txHash }; }