UNPKG

@openzeppelin/hardhat-upgrades

Version:

[![Docs](https://img.shields.io/badge/docs-%F0%9F%93%84-blue)](https://docs.openzeppelin.com/upgrades-plugins/hardhat-upgrades) [![NPM Package](https://img.shields.io/npm/v/@openzeppelin/hardhat-upgrades.svg)](https://www.npmjs.org/package/@openzeppelin/h

55 lines (46 loc) • 2.31 kB
import { HardhatRuntimeEnvironment } from 'hardhat/types/hre'; import type { NetworkConnection } from 'hardhat/types/network'; import type { ContractFactory, ethers } from 'ethers'; import { ContractAddressOrInstance, getContractAddress, PrepareUpgradeOptions } from './utils/index.js'; import { DeployImplementationResponse } from './deploy-implementation.js'; import { enableDefender } from './defender/utils.js'; import { deployImplForUpgrade as engineDeployImplForUpgrade } from './engine/prepare-upgrade.js'; import { makeEthersBinding, contractInfo, txResponseOf } from './ethers-binding.js'; export type PrepareUpgradeFunction = ( referenceAddressOrContract: ContractAddressOrInstance, ImplFactory: ContractFactory, opts?: PrepareUpgradeOptions, ) => Promise<DeployImplementationResponse>; /** Implementation deployment for an upgrade, with the ethers transaction response for `getTxResponse`. */ export interface DeployedImpl { impl: string; txResponse?: ethers.TransactionResponse; } export function makePrepareUpgrade( hre: HardhatRuntimeEnvironment, defenderModule: boolean, connection: NetworkConnection, ): PrepareUpgradeFunction { return async function prepareUpgrade(referenceAddressOrContract, ImplFactory, opts: PrepareUpgradeOptions = {}) { opts = enableDefender(hre, defenderModule, opts); const deployedImpl = await deployImplForUpgrade(hre, referenceAddressOrContract, ImplFactory, opts, connection); if (opts.getTxResponse && deployedImpl.txResponse) { return deployedImpl.txResponse; } else { return deployedImpl.impl; } }; } export async function deployImplForUpgrade( hre: HardhatRuntimeEnvironment, referenceAddressOrContract: ContractAddressOrInstance, ImplFactory: ContractFactory, opts: PrepareUpgradeOptions = {}, connection: NetworkConnection, ): Promise<DeployedImpl> { const referenceAddress = await getContractAddress(referenceAddressOrContract); const binding = makeEthersBinding(hre, connection, ImplFactory.runner, opts); const deployedImpl = await engineDeployImplForUpgrade(binding, referenceAddress, contractInfo(ImplFactory), opts); const txResponse = opts.getTxResponse ? await txResponseOf(deployedImpl.deployment, connection) : undefined; return { impl: deployedImpl.impl, txResponse }; }