Skip to content

Commit 66331aa

Browse files
authored
Defender: Add metadata option (#1079)
1 parent d43766a commit 66331aa

File tree

7 files changed

+117
-25
lines changed

7 files changed

+117
-25
lines changed

docs/modules/ROOT/pages/api-hardhat-upgrades.adoc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ The following options are common to some functions.
3232
* `useDefenderDeploy`: (`boolean`) Deploy contracts using OpenZeppelin Defender instead of ethers.js. See xref:defender-deploy.adoc[Using with OpenZeppelin Defender].
3333
* `verifySourceCode`: (`boolean`) When using OpenZeppelin Defender deployments, whether to verify source code on block explorers. Defaults to `true`.
3434
* `relayerId`: (`string`) When using OpenZeppelin Defender deployments, the ID of the relayer to use for the deployment. Defaults to the relayer configured for your deployment environment on Defender.
35-
* `salt`: (`string`) When using OpenZeppelin Defender deployments, if this is not set, deployments will be performed using the CREATE opcode. If this is set, deployments will be performed using the CREATE2 opcode with the provided salt. Note that deployments using a Safe are done using CREATE2 and require a salt. **Warning:** CREATE2 affects `msg.sender` behavior. See https://docs.openzeppelin.com/defender/v2/tutorial/deploy#deploy-caveat[Caveats] for more information.
36-
37-
35+
* `salt`: (`string`) When using OpenZeppelin Defender deployments, if this is not set, deployments will be performed using the CREATE opcode. If this is set, deployments will be performed using the CREATE2 opcode with the provided salt. Note that deployments using a Safe are done using CREATE2 and require a salt. **Warning:** CREATE2 affects `msg.sender` behavior. See https://docs.openzeppelin.com/defender/tutorial/deploy#deploy-caveat[Caveats] for more information.
36+
* `metadata`: (`{ commitHash?: string; tag?: string; [k: string]: any; }`) When using OpenZeppelin Defender deployments, you can use this to identify, tag, or classify deployments. See https://docs.openzeppelin.com/defender/module/deploy#metadata[Metadata].
3837

3938
Note that the options `unsafeAllow` can also be specified in a more granular way directly in the source code if using Solidity >=0.8.2. See xref:faq.adoc#how-can-i-disable-checks[How can I disable some of the checks?]
4039

packages/plugin-hardhat/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 3.3.0 (2024-09-16)
4+
5+
- Defender: Add `metadata` option. ([#1079](https://github.com/OpenZeppelin/openzeppelin-upgrades/pull/1079))
6+
37
## 3.2.1 (2024-07-31)
48

59
- Fix Hardhat compile error when public variables are used to implement interface functions. ([#1055](https://github.com/OpenZeppelin/openzeppelin-upgrades/pull/1055))

packages/plugin-hardhat/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@openzeppelin/hardhat-upgrades",
3-
"version": "3.2.1",
3+
"version": "3.3.0",
44
"description": "",
55
"repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/plugin-hardhat",
66
"license": "MIT",
@@ -35,9 +35,9 @@
3535
"sinon": "^18.0.0"
3636
},
3737
"dependencies": {
38-
"@openzeppelin/defender-sdk-base-client": "^1.10.0",
39-
"@openzeppelin/defender-sdk-deploy-client": "^1.10.0",
40-
"@openzeppelin/defender-sdk-network-client": "^1.10.0",
38+
"@openzeppelin/defender-sdk-base-client": "^1.14.4",
39+
"@openzeppelin/defender-sdk-deploy-client": "^1.14.4",
40+
"@openzeppelin/defender-sdk-network-client": "^1.14.4",
4141
"@openzeppelin/upgrades-core": "^1.35.0",
4242
"chalk": "^4.1.0",
4343
"debug": "^4.1.1",

packages/plugin-hardhat/src/defender/deploy.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ export async function defenderDeploy(
113113
createFactoryAddress: opts.createFactoryAddress,
114114
txOverrides: parseTxOverrides(opts.txOverrides),
115115
libraries: contractInfo.libraries,
116+
metadata: opts.metadata,
116117
};
117118

118119
let deploymentResponse: DeploymentResponse;

packages/plugin-hardhat/src/utils/options.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SourceCodeLicense } from '@openzeppelin/defender-sdk-deploy-client';
1+
import { DeployMetadata, SourceCodeLicense } from '@openzeppelin/defender-sdk-deploy-client';
22
import {
33
DeployOpts,
44
ProxyKindOption,
@@ -67,6 +67,7 @@ export type DefenderDeployOptions = DefenderDeploy & {
6767
createFactoryAddress?: string;
6868
licenseType?: SourceCodeLicense;
6969
skipLicenseType?: boolean;
70+
metadata?: DeployMetadata;
7071
};
7172

7273
/**

packages/plugin-hardhat/test/defender-deploy.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ test('calls defender deploy', async t => {
109109
createFactoryAddress: undefined,
110110
txOverrides: undefined,
111111
libraries: undefined,
112+
metadata: undefined,
112113
});
113114

114115
assertResult(t, result);
@@ -137,6 +138,7 @@ test('calls defender deploy with relayerId', async t => {
137138
createFactoryAddress: undefined,
138139
txOverrides: undefined,
139140
libraries: undefined,
141+
metadata: undefined,
140142
});
141143

142144
assertResult(t, result);
@@ -165,6 +167,7 @@ test('calls defender deploy with salt', async t => {
165167
createFactoryAddress: undefined,
166168
txOverrides: undefined,
167169
libraries: undefined,
170+
metadata: undefined,
168171
});
169172

170173
assertResult(t, result);
@@ -193,6 +196,7 @@ test('calls defender deploy with createFactoryAddress', async t => {
193196
createFactoryAddress: CREATE_FACTORY,
194197
txOverrides: undefined,
195198
libraries: undefined,
199+
metadata: undefined,
196200
});
197201

198202
assertResult(t, result);
@@ -221,6 +225,7 @@ test('calls defender deploy with license', async t => {
221225
createFactoryAddress: undefined,
222226
txOverrides: undefined,
223227
libraries: undefined,
228+
metadata: undefined,
224229
});
225230

226231
assertResult(t, result);
@@ -251,6 +256,7 @@ test('calls defender deploy - licenseType', async t => {
251256
createFactoryAddress: undefined,
252257
txOverrides: undefined,
253258
libraries: undefined,
259+
metadata: undefined,
254260
});
255261

256262
assertResult(t, result);
@@ -281,6 +287,7 @@ test('calls defender deploy - verifySourceCode false', async t => {
281287
createFactoryAddress: undefined,
282288
txOverrides: undefined,
283289
libraries: undefined,
290+
metadata: undefined,
284291
});
285292

286293
assertResult(t, result);
@@ -311,6 +318,7 @@ test('calls defender deploy - skipLicenseType', async t => {
311318
createFactoryAddress: undefined,
312319
txOverrides: undefined,
313320
libraries: undefined,
321+
metadata: undefined,
314322
});
315323

316324
assertResult(t, result);
@@ -392,6 +400,7 @@ test('calls defender deploy - no contract license', async t => {
392400
createFactoryAddress: undefined,
393401
txOverrides: undefined,
394402
libraries: undefined,
403+
metadata: undefined,
395404
});
396405

397406
assertResult(t, result);
@@ -420,6 +429,7 @@ test('calls defender deploy - unlicensed', async t => {
420429
createFactoryAddress: undefined,
421430
txOverrides: undefined,
422431
libraries: undefined,
432+
metadata: undefined,
423433
});
424434

425435
assertResult(t, result);
@@ -448,6 +458,7 @@ test('calls defender deploy with constructor args', async t => {
448458
createFactoryAddress: undefined,
449459
txOverrides: undefined,
450460
libraries: undefined,
461+
metadata: undefined,
451462
});
452463

453464
assertResult(t, result);
@@ -476,6 +487,7 @@ test('calls defender deploy with constructor args with array', async t => {
476487
createFactoryAddress: undefined,
477488
txOverrides: undefined,
478489
libraries: undefined,
490+
metadata: undefined,
479491
});
480492

481493
assertResult(t, result);
@@ -504,6 +516,7 @@ test('calls defender deploy with verify false', async t => {
504516
createFactoryAddress: undefined,
505517
txOverrides: undefined,
506518
libraries: undefined,
519+
metadata: undefined,
507520
});
508521

509522
assertResult(t, result);
@@ -532,6 +545,7 @@ test('calls defender deploy with ERC1967Proxy', async t => {
532545
createFactoryAddress: undefined,
533546
txOverrides: undefined,
534547
libraries: undefined,
548+
metadata: undefined,
535549
});
536550
});
537551

@@ -558,6 +572,7 @@ test('calls defender deploy with ERC1967Proxy - ignores constructorArgs', async
558572
createFactoryAddress: undefined,
559573
txOverrides: undefined,
560574
libraries: undefined,
575+
metadata: undefined,
561576
});
562577
});
563578

@@ -584,6 +599,7 @@ test('calls defender deploy with ERC1967Proxy - ignores empty constructorArgs',
584599
createFactoryAddress: undefined,
585600
txOverrides: undefined,
586601
libraries: undefined,
602+
metadata: undefined,
587603
});
588604
});
589605

@@ -610,6 +626,7 @@ test('calls defender deploy with BeaconProxy', async t => {
610626
createFactoryAddress: undefined,
611627
txOverrides: undefined,
612628
libraries: undefined,
629+
metadata: undefined,
613630
});
614631
});
615632

@@ -639,6 +656,7 @@ test('calls defender deploy with TransparentUpgradeableProxy', async t => {
639656
createFactoryAddress: undefined,
640657
txOverrides: undefined,
641658
libraries: undefined,
659+
metadata: undefined,
642660
});
643661
});
644662

@@ -670,6 +688,7 @@ test('calls defender deploy with txOverrides.gasLimit', async t => {
670688
maxPriorityFeePerGas: undefined,
671689
},
672690
libraries: undefined,
691+
metadata: undefined,
673692
});
674693

675694
assertResult(t, result);
@@ -703,6 +722,7 @@ test('calls defender deploy with txOverrides.gasPrice', async t => {
703722
maxPriorityFeePerGas: undefined,
704723
},
705724
libraries: undefined,
725+
metadata: undefined,
706726
});
707727

708728
assertResult(t, result);
@@ -738,6 +758,7 @@ test('calls defender deploy with txOverrides.maxFeePerGas and txOverrides.maxPri
738758
maxPriorityFeePerGas: '0xa',
739759
},
740760
libraries: undefined,
761+
metadata: undefined,
741762
});
742763

743764
assertResult(t, result);
@@ -772,6 +793,7 @@ test('calls defender deploy with external library', async t => {
772793
libraries: {
773794
'contracts/ExternalLibraries.sol:SafeMath': EXTERNAL_LIBRARY_ADDRESS,
774795
},
796+
metadata: undefined,
775797
});
776798

777799
assertResult(t, result);
@@ -808,6 +830,46 @@ test('calls defender deploy with multiple external libraries', async t => {
808830
'contracts/ExternalLibraries.sol:SafeMath': EXTERNAL_LIBRARY_ADDRESS,
809831
'contracts/ExternalLibraries.sol:SafeMathV2': EXTERNAL_LIBRARY_2_ADDRESS,
810832
},
833+
metadata: undefined,
834+
});
835+
836+
assertResult(t, result);
837+
});
838+
839+
test('calls defender deploy with metadata', async t => {
840+
const { spy, deploy, fakeHre, fakeChainId } = t.context;
841+
842+
const contractPath = 'contracts/Greeter.sol';
843+
const contractName = 'Greeter';
844+
845+
const factory = await ethers.getContractFactory(contractName);
846+
const result = await deploy.defenderDeploy(fakeHre, factory, {
847+
metadata: {
848+
commitHash: '4ae3e0d',
849+
tag: 'v1.0.0',
850+
anyOtherField: 'anyValue',
851+
},
852+
});
853+
854+
const buildInfo = await hre.artifacts.getBuildInfo(`${contractPath}:${contractName}`);
855+
sinon.assert.calledWithExactly(spy, {
856+
contractName: contractName,
857+
contractPath: contractPath,
858+
network: fakeChainId,
859+
artifactPayload: JSON.stringify(buildInfo),
860+
licenseType: undefined,
861+
constructorBytecode: '0x',
862+
verifySourceCode: true,
863+
relayerId: undefined,
864+
salt: undefined,
865+
createFactoryAddress: undefined,
866+
txOverrides: undefined,
867+
libraries: undefined,
868+
metadata: {
869+
commitHash: '4ae3e0d',
870+
tag: 'v1.0.0',
871+
anyOtherField: 'anyValue',
872+
},
811873
});
812874

813875
assertResult(t, result);

yarn.lock

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -803,29 +803,29 @@
803803
resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210"
804804
integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==
805805

806-
"@openzeppelin/[email protected].3", "@openzeppelin/defender-sdk-base-client@^1.10.0":
807-
version "1.14.3"
808-
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.14.3.tgz#f44d6cdf709c1cfd44f5f5120679eb7c81678e71"
809-
integrity sha512-4yG9E8N1c/ZP2jNR+Ah19wi7SBKpauAV/VcYcm7rg1dltDbzbH/oZnnXJlymT7IfjTPXkKHW8TPsaqz3EjS7tA==
806+
"@openzeppelin/defender-sdk-base-client@^1.14.4":
807+
version "1.14.4"
808+
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.14.4.tgz#3ccd3beb94cba61883f769afe7e6fdbdc5daa12d"
809+
integrity sha512-tOePVQLKpqfGQ1GMzHvSBNd2psPYd86LDNpvdl5gjD0Y2kW/zNh5qBXy29RraGtk/qc8zs9hzS5pAOh0vhGkGQ==
810810
dependencies:
811811
amazon-cognito-identity-js "^6.3.6"
812812
async-retry "^1.3.3"
813813

814-
"@openzeppelin/defender-sdk-deploy-client@^1.10.0":
815-
version "1.14.3"
816-
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.14.3.tgz#4676f454ba333664174edcf8c419a1fc0d04e780"
817-
integrity sha512-51WIZJz251lndK7uQU4gBE0gBX+2ZNTgf+hemtJUEPCpHtkooBRFFMID3EPGMKXVqf872pU8K3Huu9PyYQu6bw==
814+
"@openzeppelin/defender-sdk-deploy-client@^1.14.4":
815+
version "1.14.4"
816+
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.14.4.tgz#1feb94575a32ed4ddee81d03cdb060064936a528"
817+
integrity sha512-+diSoz1zid37LMsY2RDxI+uAsYx9Eryg8Vz+yfvuyd56fXrzjQEln7BBtYQw+2zp9yvyAByOL5XSQdrQga9OBQ==
818818
dependencies:
819-
"@openzeppelin/defender-sdk-base-client" "1.14.3"
819+
"@openzeppelin/defender-sdk-base-client" "^1.14.4"
820820
axios "^1.7.2"
821821
lodash "^4.17.21"
822822

823-
"@openzeppelin/defender-sdk-network-client@^1.10.0":
824-
version "1.14.3"
825-
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.14.3.tgz#7b8ab18b5f7a62d2fd41d4b9f13581be91861f4d"
826-
integrity sha512-qrJLs2ubKSwrhP0x4V2QOPhlc1q8TYnkAcvjvk34VXMS8lhY1cpXSGoxnTw3Mi+eCSE1xOzKWISLi1UAOQOJIw==
823+
"@openzeppelin/defender-sdk-network-client@^1.14.4":
824+
version "1.14.4"
825+
resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.14.4.tgz#0f89c45f601e28c2f87c487b62b48d9cd4b5b956"
826+
integrity sha512-OS0H5b0vgYacJcwkvUFJUaRuyUaXhIRl916W5xLvGia5H6i/qn3dP8MZ7oLcPwKc8jB+ucRytO4H/AHsea0aVA==
827827
dependencies:
828-
"@openzeppelin/defender-sdk-base-client" "1.14.3"
828+
"@openzeppelin/defender-sdk-base-client" "^1.14.4"
829829
axios "^1.7.2"
830830
lodash "^4.17.21"
831831

@@ -5143,7 +5143,16 @@ [email protected]:
51435143
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
51445144
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
51455145

5146-
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
5146+
"string-width-cjs@npm:string-width@^4.2.0":
5147+
version "4.2.3"
5148+
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
5149+
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
5150+
dependencies:
5151+
emoji-regex "^8.0.0"
5152+
is-fullwidth-code-point "^3.0.0"
5153+
strip-ansi "^6.0.1"
5154+
5155+
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
51475156
version "4.2.3"
51485157
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
51495158
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -5214,7 +5223,7 @@ string_decoder@^1.1.1:
52145223
dependencies:
52155224
safe-buffer "~5.2.0"
52165225

5217-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
5226+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
52185227
version "6.0.1"
52195228
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
52205229
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -5228,6 +5237,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
52285237
dependencies:
52295238
ansi-regex "^4.1.0"
52305239

5240+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
5241+
version "6.0.1"
5242+
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
5243+
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
5244+
dependencies:
5245+
ansi-regex "^5.0.1"
5246+
52315247
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
52325248
version "7.1.0"
52335249
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
@@ -5700,7 +5716,7 @@ workerpool@^6.5.1:
57005716
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544"
57015717
integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==
57025718

5703-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
5719+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
57045720
version "7.0.0"
57055721
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
57065722
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -5727,6 +5743,15 @@ wrap-ansi@^6.2.0:
57275743
string-width "^4.1.0"
57285744
strip-ansi "^6.0.0"
57295745

5746+
wrap-ansi@^7.0.0:
5747+
version "7.0.0"
5748+
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
5749+
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
5750+
dependencies:
5751+
ansi-styles "^4.0.0"
5752+
string-width "^4.1.0"
5753+
strip-ansi "^6.0.0"
5754+
57305755
wrap-ansi@^8.1.0:
57315756
version "8.1.0"
57325757
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)