Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/plugin-hardhat/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Changelog

## Unreleased
## 3.0.5 (2024-03-07)

- Simplify console logging for `admin.transferProxyAdminOwnership`. ([#978](https://github.com/OpenZeppelin/openzeppelin-upgrades/pull/978))
- Support private networks and forked networks with Defender. ([#989](https://github.com/OpenZeppelin/openzeppelin-upgrades/pull/989))

## 3.0.4 (2024-02-27)

Expand Down
7 changes: 4 additions & 3 deletions packages/plugin-hardhat/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@openzeppelin/hardhat-upgrades",
"version": "3.0.4",
"version": "3.0.5",
"description": "",
"repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/plugin-hardhat",
"license": "MIT",
Expand Down Expand Up @@ -37,8 +37,9 @@
"dependencies": {
"@openzeppelin/defender-admin-client": "^1.52.0",
"@openzeppelin/defender-base-client": "^1.52.0",
"@openzeppelin/defender-sdk-base-client": "^1.9.0",
"@openzeppelin/defender-sdk-deploy-client": "^1.9.0",
"@openzeppelin/defender-sdk-base-client": "^1.10.0",
"@openzeppelin/defender-sdk-deploy-client": "^1.10.0",
"@openzeppelin/defender-sdk-network-client": "^1.10.0",
"@openzeppelin/upgrades-core": "^1.32.0",
"chalk": "^4.1.0",
"debug": "^4.1.1",
Expand Down
12 changes: 12 additions & 0 deletions packages/plugin-hardhat/src/defender/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { DeployClient } from '@openzeppelin/defender-sdk-deploy-client';
import { NetworkClient } from '@openzeppelin/defender-sdk-network-client';
import { HardhatRuntimeEnvironment } from 'hardhat/types';
import { getDefenderApiKey } from './utils';

export function getNetworkClient(hre: HardhatRuntimeEnvironment): NetworkClient {
return new NetworkClient(getDefenderApiKey(hre));
}

export function getDeployClient(hre: HardhatRuntimeEnvironment): DeployClient {
return new DeployClient(getDefenderApiKey(hre));
}
3 changes: 2 additions & 1 deletion packages/plugin-hardhat/src/defender/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ import BeaconProxy from '@openzeppelin/upgrades-core/artifacts/@openzeppelin/con
import UpgradeableBeacon from '@openzeppelin/upgrades-core/artifacts/@openzeppelin/contracts-v5/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json';
import TransparentUpgradeableProxy from '@openzeppelin/upgrades-core/artifacts/@openzeppelin/contracts-v5/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json';

import { getNetwork, getDeployClient, parseTxOverrides } from './utils';
import { getNetwork, parseTxOverrides } from './utils';
import { DeployTransaction, DefenderDeployOptions, UpgradeOptions, EthersDeployOptions } from '../utils';
import debug from '../utils/debug';
import { getDeployData } from '../utils/deploy-impl';
import { ContractSourceNotFoundError } from '@openzeppelin/upgrades-core';
import { getDeployClient } from './client';

const deployableProxyContracts = [ERC1967Proxy, BeaconProxy, UpgradeableBeacon, TransparentUpgradeableProxy];

Expand Down
3 changes: 2 additions & 1 deletion packages/plugin-hardhat/src/defender/get-approval-process.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { HardhatRuntimeEnvironment } from 'hardhat/types';

import { getNetwork, getDeployClient } from './utils';
import { getNetwork } from './utils';
import { getDeployClient } from './client';
import { ApprovalProcessResponse } from '@openzeppelin/defender-sdk-deploy-client';

export interface ApprovalProcess {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ import {
import { ContractFactory, ethers } from 'ethers';
import { HardhatRuntimeEnvironment } from 'hardhat/types';
import { DefenderDeployOptions, UpgradeOptions } from '../utils';
import { getNetwork, enableDefender, getDeployClient } from './utils';
import { getNetwork, enableDefender } from './utils';
import { deployImplForUpgrade } from '../prepare-upgrade';
import { getDeployClient } from './client';

export interface UpgradeProposalResponse {
proposalId: string;
Expand Down
21 changes: 16 additions & 5 deletions packages/plugin-hardhat/src/defender/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@ import {
} from '@openzeppelin/upgrades-core';

import { Network, fromChainId } from '@openzeppelin/defender-sdk-base-client';
import { DeployClient, TxOverrides } from '@openzeppelin/defender-sdk-deploy-client';
import { TxOverrides } from '@openzeppelin/defender-sdk-deploy-client';

import { HardhatDefenderConfig } from '../type-extensions';
import { DefenderDeploy } from '../utils';
import debug from '../utils/debug';
import { Overrides } from 'ethers';

import { promisify } from 'util';
import { getDeployClient, getNetworkClient } from './client';
const sleep = promisify(setTimeout);

export function getDefenderApiKey(hre: HardhatRuntimeEnvironment): HardhatDefenderConfig {
Expand All @@ -35,6 +36,20 @@ export async function getNetwork(hre: HardhatRuntimeEnvironment): Promise<Networ
const chainId = hre.network.config.chainId ?? (await getChainId(provider));
const network = fromChainId(chainId);
if (network === undefined) {
const networkClient = getNetworkClient(hre);

const forkedNetworks = await networkClient.listForkedNetworks();
const forkedNetwork = forkedNetworks.find(n => n.chainId === chainId);
if (forkedNetwork !== undefined) {
return forkedNetwork.name;
}

const privateNetworks = await networkClient.listPrivateNetworks();
const privateNetwork = privateNetworks.find(n => n.chainId === chainId);
if (privateNetwork !== undefined) {
return privateNetwork.name;
}

throw new Error(`Network ${chainId} is not supported by OpenZeppelin Defender`);
}
return network;
Expand Down Expand Up @@ -87,10 +102,6 @@ export function disableDefender(
}
}

export function getDeployClient(hre: HardhatRuntimeEnvironment): DeployClient {
return new DeployClient(getDefenderApiKey(hre));
}

/**
* Gets the remote deployment response for the given id.
*
Expand Down
4 changes: 4 additions & 0 deletions packages/plugin-hardhat/test/defender-deploy.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
'../utils/etherscan-api': {
Expand Down Expand Up @@ -582,6 +584,8 @@ async function testGetDeployedContractPolling(t, getDeployedContractStub, expect
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => fakeChainId,
},
'./client': {
getDeployClient: () => defenderClientWaits,
},
'../utils/etherscan-api': {
Expand Down
2 changes: 2 additions & 0 deletions packages/plugin-hardhat/test/defender-get-approval-process.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
});
Expand Down
80 changes: 78 additions & 2 deletions packages/plugin-hardhat/test/defender-utils.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const test = require('ava');
const sinon = require('sinon');
const { getNetwork, disableDefender, enableDefender, getDeployClient } = require('../dist/defender/utils');
const proxyquire = require('proxyquire').noCallThru();
const { getNetwork, disableDefender, enableDefender } = require('../dist/defender/utils');
const { getDeployClient } = require('../dist/defender/client');

test.beforeEach(async t => {
t.context.fakeChainId = '0x05';
Expand All @@ -24,7 +26,81 @@ test('returns defender network definition', async t => {

test('fails if chain id is not accepted', async t => {
t.context.fakeChainId = '0x123456';
await t.throwsAsync(() => getNetwork(t.context.fakeHre), { message: /Network \d+ is not supported/ });

const fakeNetworkClient = {
listForkedNetworks: () => {
return [];
},
listPrivateNetworks: () => {
return [];
},
};

const utils = proxyquire('../dist/defender/utils', {
'./client': {
getNetworkClient: () => fakeNetworkClient,
},
});

await t.throwsAsync(() => utils.getNetwork(t.context.fakeHre), { message: /Network \d+ is not supported/ });
});

test('forked network', async t => {
t.context.fakeChainId = '0x123456';

const fakeNetworkClient = {
listForkedNetworks: () => {
return [
{
chainId: 0x222222,
name: 'other-forked-network',
},
{
chainId: 0x123456,
name: 'my-forked-network',
},
];
},
listPrivateNetworks: () => {
return [];
},
};

const utils = proxyquire('../dist/defender/utils', {
'./client': {
getNetworkClient: () => fakeNetworkClient,
},
});

const network = await utils.getNetwork(t.context.fakeHre);
t.is(network, 'my-forked-network');
});

test('private network', async t => {
t.context.fakeChainId = '0x123456';

const fakeNetworkClient = {
listForkedNetworks: () => {
return [];
},
listPrivateNetworks: () => {
return [
{
chainId: 0x123456,
name: 'my-private-network',
},
];
},
};

const utils = proxyquire('../dist/defender/utils', {
'./client': {
getNetworkClient: () => fakeNetworkClient,
},
});

const network = await utils.getNetwork(t.context.fakeHre);
t.is(network, 'my-private-network');
});

test('fails if defender config is missing', async t => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
}).makeProposeUpgradeWithApproval(hre);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
}).makeProposeUpgradeWithApproval(hre);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
}).makeProposeUpgradeWithApproval(hre);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
}).makeProposeUpgradeWithApproval(hre);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ test.beforeEach(async t => {
'./utils': {
...require('../dist/defender/utils'),
getNetwork: () => t.context.fakeChainId,
},
'./client': {
getDeployClient: () => t.context.fakeDefenderClient,
},
}).makeProposeUpgradeWithApproval(hre);
Expand Down
14 changes: 12 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1038,15 +1038,15 @@
lodash "^4.17.19"
node-fetch "^2.6.0"

"@openzeppelin/defender-sdk-base-client@^1.10.0", "@openzeppelin/defender-sdk-base-client@^1.9.0":
"@openzeppelin/defender-sdk-base-client@^1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.10.0.tgz#038a5b13f92e03de42382ec331b670f40a915816"
integrity sha512-V21oI4G54sdEJ9lVN8q5OqfFRUoVDzjeXfWgpQvUpfy69r56NnE57D6e5RLG1fRp1J0APfW3lFjaaLwl0kqZpg==
dependencies:
amazon-cognito-identity-js "^6.3.6"
async-retry "^1.3.3"

"@openzeppelin/defender-sdk-deploy-client@^1.9.0":
"@openzeppelin/defender-sdk-deploy-client@^1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.10.0.tgz#64d7789eceede36ec12dcdae0dc4b67ffa7ae97d"
integrity sha512-PckmUQYwe26/u/s3sjLateSNtKQ0tdAaOyP6spsgaT+us+XUUqAt/EUfEJdGpt8JApsRWYzrQzH6Z0ywoUyqyw==
Expand All @@ -1056,6 +1056,16 @@
axios "^1.6.7"
lodash "^4.17.21"

"@openzeppelin/defender-sdk-network-client@^1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.10.0.tgz#0da6113d994f1b48a4cee4313e1befc31acab800"
integrity sha512-nrSuJ4KKhTIO2f1WIKtCq0XbeHb4ExqvpIE2g4yf/k8DmZuM9SR6xNDLz7wuKt11u+U88AYBN9MoiKRo/ybp6w==
dependencies:
"@ethersproject/abi" "^5.7.0"
"@openzeppelin/defender-sdk-base-client" "^1.10.0"
axios "^1.6.7"
lodash "^4.17.21"

"@openzeppelin/docs-utils@^0.1.0":
version "0.1.5"
resolved "https://registry.yarnpkg.com/@openzeppelin/docs-utils/-/docs-utils-0.1.5.tgz#ae5b50612f84cba08006b25554dab4a05910c527"
Expand Down