@openzeppelin/upgrades-core 1.35.1 → 1.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/cli/cli.test.js +160 -0
  3. package/dist/cli/cli.test.js.map +1 -1
  4. package/dist/cli/validate/build-info-file.d.ts +4 -0
  5. package/dist/cli/validate/build-info-file.d.ts.map +1 -1
  6. package/dist/cli/validate/build-info-file.js +7 -2
  7. package/dist/cli/validate/build-info-file.js.map +1 -1
  8. package/dist/cli/validate/contract-report.d.ts +5 -5
  9. package/dist/cli/validate/contract-report.d.ts.map +1 -1
  10. package/dist/cli/validate/contract-report.js +12 -6
  11. package/dist/cli/validate/contract-report.js.map +1 -1
  12. package/dist/cli/validate/find-contract.d.ts +7 -2
  13. package/dist/cli/validate/find-contract.d.ts.map +1 -1
  14. package/dist/cli/validate/find-contract.js +32 -4
  15. package/dist/cli/validate/find-contract.js.map +1 -1
  16. package/dist/cli/validate/upgradeability-assessment.d.ts +2 -1
  17. package/dist/cli/validate/upgradeability-assessment.d.ts.map +1 -1
  18. package/dist/cli/validate/upgradeability-assessment.js +2 -2
  19. package/dist/cli/validate/upgradeability-assessment.js.map +1 -1
  20. package/dist/cli/validate/validate-upgrade-safety.d.ts +11 -3
  21. package/dist/cli/validate/validate-upgrade-safety.d.ts.map +1 -1
  22. package/dist/cli/validate/validate-upgrade-safety.js +27 -7
  23. package/dist/cli/validate/validate-upgrade-safety.js.map +1 -1
  24. package/dist/cli/validate/validate-upgrade-safety.test.js +1 -1
  25. package/dist/cli/validate/validations.d.ts +1 -0
  26. package/dist/cli/validate/validations.d.ts.map +1 -1
  27. package/dist/cli/validate/validations.js +1 -0
  28. package/dist/cli/validate/validations.js.map +1 -1
  29. package/dist/cli/validate/validations.test.js +8 -4
  30. package/dist/cli/validate/validations.test.js.map +1 -1
  31. package/dist/cli/validate.d.ts +1 -0
  32. package/dist/cli/validate.d.ts.map +1 -1
  33. package/dist/cli/validate.js +6 -3
  34. package/dist/cli/validate.js.map +1 -1
  35. package/package.json +2 -2
  36. package/src/cli/cli.test.ts +274 -0
  37. package/src/cli/cli.test.ts.md +119 -0
  38. package/src/cli/cli.test.ts.snap +0 -0
  39. package/src/cli/validate/build-info-file.ts +15 -4
  40. package/src/cli/validate/contract-report.ts +12 -7
  41. package/src/cli/validate/find-contract.ts +50 -4
  42. package/src/cli/validate/upgradeability-assessment.ts +3 -2
  43. package/src/cli/validate/validate-upgrade-safety.test.ts +1 -1
  44. package/src/cli/validate/validate-upgrade-safety.ts +36 -6
  45. package/src/cli/validate/validations.test.ts +8 -4
  46. package/src/cli/validate/validations.ts +2 -0
  47. package/src/cli/validate.ts +7 -2
@@ -15,13 +15,21 @@ export type SpecifiedContracts = {
15
15
  * Validates the upgrade safety of all contracts in the build info dir's build info files.
16
16
  * Only contracts that are detected as upgradeable will be validated.
17
17
  *
18
- * @param buildInfoDir Absolute path of build info directory, or undefined to use the default Hardhat or Foundry build-info dir.
18
+ * @param buildInfoDir Path of build info directory, or undefined to use the default Hardhat or Foundry build-info dir.
19
19
  * @param contract The name or fully qualified name of the contract to validate. If not specified, all upgradeable contracts in the build info directory will be validated.
20
20
  * @param reference The name or fully qualified name of the reference contract to use for storage layout comparisons. Can only be used along with `contract`. If not specified, uses the `@custom:oz-upgrades-from` annotation in the contract that is being validated.
21
21
  * @param opts Validation options, or undefined to use the default validation options.
22
+ * @param referenceBuildInfoDirs Optional paths of additional build info directories from previous versions of the project to use for storage layout comparisons. When using this option, refer to one of these directories using prefix `<dirName>:` before the contract name or fully qualified name in the `reference` param or `@custom:oz-upgrades-from` annotation, where `<dirName>` is the directory short name. Each directory short name must be unique, including compared to the main build info directory.
22
23
  * @returns The project report.
23
24
  */
24
- export declare function validateUpgradeSafety(buildInfoDir?: string, contract?: string, reference?: string, opts?: ValidateUpgradeSafetyOptions): Promise<ProjectReport>;
25
- export declare function findSpecifiedContracts(sourceContracts: SourceContract[], opts: Required<ValidateUpgradeSafetyOptions>, contractName?: string, referenceName?: string): SpecifiedContracts | undefined;
25
+ export declare function validateUpgradeSafety(buildInfoDir?: string, contract?: string, reference?: string, opts?: ValidateUpgradeSafetyOptions, referenceBuildInfoDirs?: string[]): Promise<ProjectReport>;
26
+ /**
27
+ * Dictionary of build info directories and the contracts they contain.
28
+ * Main build info directory can be found with the key '' and also with its short name.
29
+ */
30
+ export interface BuildInfoDictionary {
31
+ [buildInfoDirName: string]: SourceContract[];
32
+ }
33
+ export declare function findSpecifiedContracts(buildInfoDictionary: BuildInfoDictionary, opts: Required<ValidateUpgradeSafetyOptions>, contractName?: string, referenceName?: string): SpecifiedContracts | undefined;
26
34
  export declare function withCliDefaults(opts: ValidateUpgradeSafetyOptions): Required<ValidateUpgradeSafetyOptions>;
27
35
  //# sourceMappingURL=validate-upgrade-safety.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-upgrade-safety.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0B,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,GAAE,4BAAiC,GACtC,OAAO,CAAC,aAAa,CAAC,CAUxB;AAED,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,cAAc,EAAE,EACjC,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,kBAAkB,GAAG,SAAS,CAahC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,4BAA4B,GAAG,QAAQ,CAAC,4BAA4B,CAAC,CAQ1G"}
1
+ {"version":3,"file":"validate-upgrade-safety.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA0B,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,GAAE,4BAAiC,EACvC,sBAAsB,CAAC,EAAE,MAAM,EAAE,GAChC,OAAO,CAAC,aAAa,CAAC,CA6BxB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,CAAC,gBAAgB,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC9C;AAED,wBAAgB,sBAAsB,CACpC,mBAAmB,EAAE,mBAAmB,EACxC,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,kBAAkB,GAAG,SAAS,CAahC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,4BAA4B,GAAG,QAAQ,CAAC,4BAA4B,CAAC,CAQ1G"}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.validateUpgradeSafety = validateUpgradeSafety;
4
7
  exports.findSpecifiedContracts = findSpecifiedContracts;
5
8
  exports.withCliDefaults = withCliDefaults;
9
+ const path_1 = __importDefault(require("path"));
6
10
  const __1 = require("../..");
7
11
  const build_info_file_1 = require("./build-info-file");
8
12
  const contract_report_1 = require("./contract-report");
@@ -13,25 +17,41 @@ const validations_1 = require("./validations");
13
17
  * Validates the upgrade safety of all contracts in the build info dir's build info files.
14
18
  * Only contracts that are detected as upgradeable will be validated.
15
19
  *
16
- * @param buildInfoDir Absolute path of build info directory, or undefined to use the default Hardhat or Foundry build-info dir.
20
+ * @param buildInfoDir Path of build info directory, or undefined to use the default Hardhat or Foundry build-info dir.
17
21
  * @param contract The name or fully qualified name of the contract to validate. If not specified, all upgradeable contracts in the build info directory will be validated.
18
22
  * @param reference The name or fully qualified name of the reference contract to use for storage layout comparisons. Can only be used along with `contract`. If not specified, uses the `@custom:oz-upgrades-from` annotation in the contract that is being validated.
19
23
  * @param opts Validation options, or undefined to use the default validation options.
24
+ * @param referenceBuildInfoDirs Optional paths of additional build info directories from previous versions of the project to use for storage layout comparisons. When using this option, refer to one of these directories using prefix `<dirName>:` before the contract name or fully qualified name in the `reference` param or `@custom:oz-upgrades-from` annotation, where `<dirName>` is the directory short name. Each directory short name must be unique, including compared to the main build info directory.
20
25
  * @returns The project report.
21
26
  */
22
- async function validateUpgradeSafety(buildInfoDir, contract, reference, opts = {}) {
27
+ async function validateUpgradeSafety(buildInfoDir, contract, reference, opts = {}, referenceBuildInfoDirs) {
23
28
  const allOpts = withCliDefaults(opts);
24
29
  const buildInfoFiles = await (0, build_info_file_1.getBuildInfoFiles)(buildInfoDir);
25
30
  const sourceContracts = (0, validations_1.validateBuildInfoContracts)(buildInfoFiles);
26
- const specifiedContracts = findSpecifiedContracts(sourceContracts, allOpts, contract, reference);
27
- const contractReports = (0, contract_report_1.getContractReports)(sourceContracts, allOpts, specifiedContracts);
31
+ const buildInfoDictionary = {};
32
+ buildInfoDictionary[''] = sourceContracts;
33
+ if (buildInfoFiles.length > 0) {
34
+ buildInfoDictionary[buildInfoFiles[0].dirShortName] = sourceContracts;
35
+ }
36
+ if (referenceBuildInfoDirs !== undefined) {
37
+ for (const referenceBuildInfoDir of referenceBuildInfoDirs) {
38
+ const key = path_1.default.basename(referenceBuildInfoDir);
39
+ if (buildInfoDictionary[key] !== undefined) {
40
+ throw new Error(`Reference build info directory short name '${key}' is not unique.`);
41
+ }
42
+ const referenceBuildInfoFiles = await (0, build_info_file_1.getBuildInfoFiles)(referenceBuildInfoDir);
43
+ buildInfoDictionary[key] = (0, validations_1.validateBuildInfoContracts)(referenceBuildInfoFiles);
44
+ }
45
+ }
46
+ const specifiedContracts = findSpecifiedContracts(buildInfoDictionary, allOpts, contract, reference);
47
+ const contractReports = (0, contract_report_1.getContractReports)(buildInfoDictionary, allOpts, specifiedContracts);
28
48
  return (0, project_report_1.getProjectReport)(contractReports, specifiedContracts !== undefined);
29
49
  }
30
- function findSpecifiedContracts(sourceContracts, opts, contractName, referenceName) {
50
+ function findSpecifiedContracts(buildInfoDictionary, opts, contractName, referenceName) {
31
51
  if (contractName !== undefined) {
32
52
  return {
33
- contract: (0, find_contract_1.findContract)(contractName, undefined, sourceContracts),
34
- reference: referenceName !== undefined ? (0, find_contract_1.findContract)(referenceName, undefined, sourceContracts) : undefined,
53
+ contract: (0, find_contract_1.findContract)(contractName, undefined, buildInfoDictionary, true), // only search main build info dir for the specified contract
54
+ reference: referenceName !== undefined ? (0, find_contract_1.findContract)(referenceName, undefined, buildInfoDictionary) : undefined,
35
55
  };
36
56
  }
37
57
  else if (referenceName !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"validate-upgrade-safety.js","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.ts"],"names":[],"mappings":";;AA8BA,sDAeC;AAED,wDAkBC;AAED,0CAQC;AA3ED,6BAAkE;AAElE,uDAAsD;AACtD,uDAAuD;AACvD,mDAA+C;AAC/C,qDAAmE;AACnE,+CAA2E;AAc3E;;;;;;;;;GASG;AACI,KAAK,UAAU,qBAAqB,CACzC,YAAqB,EACrB,QAAiB,EACjB,SAAkB,EAClB,OAAqC,EAAE;IAEvC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,MAAM,IAAA,mCAAiB,EAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAA,wCAA0B,EAAC,cAAc,CAAC,CAAC;IAEnE,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEjG,MAAM,eAAe,GAAG,IAAA,oCAAkB,EAAC,eAAe,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACzF,OAAO,IAAA,iCAAgB,EAAC,eAAe,EAAE,kBAAkB,KAAK,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,sBAAsB,CACpC,eAAiC,EACjC,IAA4C,EAC5C,YAAqB,EACrB,aAAsB;IAEtB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,QAAQ,EAAE,IAAA,4BAAY,EAAC,YAAY,EAAE,SAAS,EAAE,eAAe,CAAC;YAChE,SAAS,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,4BAAY,EAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;SAC7G,CAAC;IACJ,CAAC;SAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;SAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACnH,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,IAAkC;IAChE,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO;QACL,GAAG,IAAA,0BAAsB,EAAC,IAAI,CAAC;QAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,KAAK;KACjD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"validate-upgrade-safety.js","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.ts"],"names":[],"mappings":"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"}
@@ -71,7 +71,7 @@ ava_1.default.after(async () => {
71
71
  });
72
72
  (0, ava_1.default)('findSpecifiedContracts - requireReference option without contract', async (t) => {
73
73
  try {
74
- (0, validate_upgrade_safety_1.findSpecifiedContracts)([], (0, validate_upgrade_safety_1.withCliDefaults)({ requireReference: true }));
74
+ (0, validate_upgrade_safety_1.findSpecifiedContracts)({}, (0, validate_upgrade_safety_1.withCliDefaults)({ requireReference: true }));
75
75
  }
76
76
  catch (e) {
77
77
  t.true(e.message.includes('The requireReference option can only be specified when the contract option is also specified.'));
@@ -6,6 +6,7 @@ export interface SourceContract {
6
6
  name: string;
7
7
  fullyQualifiedName: string;
8
8
  validationData: ValidationRunData;
9
+ buildInfoDirShortName: string;
9
10
  }
10
11
  export declare function validateBuildInfoContracts(buildInfoFiles: BuildInfoFile[]): SourceContract[];
11
12
  //# sourceMappingURL=validations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAK5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,iBAAiB,CAAC;CACnC;AAED,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAO5F"}
1
+ {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAK5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,iBAAiB,CAAC;IAClC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAO5F"}
@@ -33,6 +33,7 @@ function addContractsFromBuildInfo(buildInfoFile, validationData, sourceContract
33
33
  name: contractDef.name,
34
34
  fullyQualifiedName,
35
35
  validationData: validationData,
36
+ buildInfoDirShortName: buildInfoFile.dirShortName,
36
37
  });
37
38
  }
38
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validations.js","sourceRoot":"","sources":["../../../src/cli/validate/validations.ts"],"names":[],"mappings":";;;;;AAiBA,gEAOC;AAxBD,6BAA4E;AAE5E,8DAAsC;AAEtC,8CAA6C;AAG7C,6DAAkE;AAUlE,SAAgB,0BAA0B,CAAC,cAA+B;IACxE,MAAM,eAAe,GAAqB,EAAE,CAAC;IAC7C,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAClD,yBAAyB,CAAC,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,aAA4B;IAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,0BAAsB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAA,YAAQ,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,yBAAyB,CAChC,aAA4B,EAC5B,cAAiC,EACjC,eAAiC;IAEjC,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC;QAEzD,KAAK,MAAM,WAAW,IAAI,IAAA,eAAO,EAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,kBAAkB,GAAG,IAAA,qCAAqB,EAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAA,eAAK,EAAC,SAAS,GAAG,kBAAkB,CAAC,CAAC;YAEtC,eAAe,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,kBAAkB;gBAClB,cAAc,EAAE,cAAc;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validations.js","sourceRoot":"","sources":["../../../src/cli/validate/validations.ts"],"names":[],"mappings":";;;;;AAkBA,gEAOC;AAzBD,6BAA4E;AAE5E,8DAAsC;AAEtC,8CAA6C;AAG7C,6DAAkE;AAWlE,SAAgB,0BAA0B,CAAC,cAA+B;IACxE,MAAM,eAAe,GAAqB,EAAE,CAAC;IAC7C,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAClD,yBAAyB,CAAC,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,aAA4B;IAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,0BAAsB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAA,YAAQ,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,yBAAyB,CAChC,aAA4B,EAC5B,cAAiC,EACjC,eAAiC;IAEjC,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC;QAEzD,KAAK,MAAM,WAAW,IAAI,IAAA,eAAO,EAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,kBAAkB,GAAG,IAAA,qCAAqB,EAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAA,eAAK,EAAC,SAAS,GAAG,kBAAkB,CAAC,CAAC;YAEtC,eAAe,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,kBAAkB;gBAClB,cAAc,EAAE,cAAc;gBAC9B,qBAAqB,EAAE,aAAa,CAAC,YAAY;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -11,13 +11,17 @@ const validate_upgrade_safety_1 = require("./validate-upgrade-safety");
11
11
  const test = ava_1.default;
12
12
  const SOURCE_FILE = 'contracts/test/cli/Validate.sol';
13
13
  test.before(async (t) => {
14
- const buildInfo = await hardhat_1.artifacts.getBuildInfo(`${SOURCE_FILE}:Safe`);
15
- if (buildInfo === undefined) {
14
+ const hardhatBuildInfo = await hardhat_1.artifacts.getBuildInfo(`${SOURCE_FILE}:Safe`);
15
+ if (hardhatBuildInfo === undefined) {
16
16
  t.fail();
17
17
  }
18
18
  else {
19
- const sourceContracts = (0, validations_1.validateBuildInfoContracts)([buildInfo]);
20
- t.context.reports = (0, contract_report_1.getContractReports)(sourceContracts, (0, validate_upgrade_safety_1.withCliDefaults)({}));
19
+ const buildInfoFile = {
20
+ ...hardhatBuildInfo,
21
+ dirShortName: 'build-info',
22
+ };
23
+ const sourceContracts = (0, validations_1.validateBuildInfoContracts)([buildInfoFile]);
24
+ t.context.reports = (0, contract_report_1.getContractReports)({ '': sourceContracts }, (0, validate_upgrade_safety_1.withCliDefaults)({}));
21
25
  }
22
26
  });
23
27
  function getReport(t, contractName) {
@@ -1 +1 @@
1
- {"version":3,"file":"validations.test.js","sourceRoot":"","sources":["../../../src/cli/validate/validations.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAsD;AAEtD,qCAAoC;AACpC,+CAA2D;AAC3D,uDAAkF;AAClF,uEAA4D;AAM5D,MAAM,IAAI,GAAG,aAAwB,CAAC;AAEtC,MAAM,WAAW,GAAG,iCAAiC,CAAC;AAEtD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;IACpB,MAAM,SAAS,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,GAAG,WAAW,OAAO,CAAC,CAAC;IAEtE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,CAAC,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;SAAM,CAAC;QACN,MAAM,eAAe,GAAG,IAAA,wCAA0B,EAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,IAAA,oCAAkB,EAAC,eAAe,EAAE,IAAA,yCAAe,EAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,CAA4B,EAAE,YAAoB;IACnE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,WAAW,IAAI,YAAY,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,YAAY,CACnB,CAA4B,EAC5B,MAA6C,EAC7C,KAA0B;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnB,oEAAoE;QACpE,CAAC,CAAC,KAAK,CAAC,MAAO,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAA0B;IACzD,MAAM,iBAAiB,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,QAAQ,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACxB,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACnC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;AACvC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAClC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAChC,SAAS,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;AAClD,SAAS,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAC3C,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AACrC,SAAS,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;AAC3C,SAAS,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACjD,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC/B,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AACrC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAChC,SAAS,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;AAC5C,SAAS,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"validations.test.js","sourceRoot":"","sources":["../../../src/cli/validate/validations.test.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ interface FunctionArgs {
6
6
  contract?: string;
7
7
  reference?: string;
8
8
  opts: Required<ValidateUpgradeSafetyOptions>;
9
+ referenceBuildInfoDirs?: string[];
9
10
  }
10
11
  /**
11
12
  * Gets and validates function arguments and options.
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,4BAA4B,EAAyB,MAAM,GAAG,CAAC;AAsBxE,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxD;AA8BD,UAAU,YAAY;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAsBlG;AAmDD,wBAAgB,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,4BAA4B,CAAC,CAapG"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,4BAA4B,EAAyB,MAAM,GAAG,CAAC;AAuBxE,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAexD;AA8BD,UAAU,YAAY;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IAC7C,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAuBlG;AAoDD,wBAAgB,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,4BAA4B,CAAC,CAapG"}
@@ -22,6 +22,7 @@ Options:
22
22
  --contract <CONTRACT> The name or fully qualified name of the contract to validate. If not specified, all upgradeable contracts in the build info directory will be validated.
23
23
  --reference <REFERENCE_CONTRACT> Can only be used when the --contract option is also provided. The name or fully qualified name of the reference contract to use for storage layout comparisons. If not specified, uses the @custom:oz-upgrades-from annotation if it is defined in the contract that is being validated.
24
24
  --requireReference Can only be used when the --contract option is also provided. Not compatible with --unsafeSkipStorageCheck. If specified, requires either the --reference option to be provided or the contract to have a @custom:oz-upgrades-from annotation.
25
+ --referenceBuildInfoDirs Optional paths of additional build info directories from previous versions of the project to use for storage layout comparisons. When using this option, refer to one of these directories using prefix '<dirName>:' before the contract name or fully qualified name in the --reference option or @custom:oz-upgrades-from annotation, where <dirName> is the directory short name. Each directory short name must be unique, including compared to the main build info directory.
25
26
  --unsafeAllow "<VALIDATION_ERRORS>" Selectively disable one or more validation errors. Comma-separated list with one or more of the following: ${run_1.errorKinds.join(', ')}
26
27
  --unsafeAllowRenames Configure storage layout check to allow variable renaming.
27
28
  --unsafeSkipStorageCheck Skips checking for storage layout compatibility errors. This is a dangerous option meant to be used as a last resort.`;
@@ -29,7 +30,7 @@ async function main(args) {
29
30
  const { parsedArgs, extraArgs } = parseArgs(args);
30
31
  if (!help(parsedArgs, extraArgs)) {
31
32
  const functionArgs = getFunctionArgs(parsedArgs, extraArgs);
32
- const result = await (0, _1.validateUpgradeSafety)(functionArgs.buildInfoDir, functionArgs.contract, functionArgs.reference, functionArgs.opts);
33
+ const result = await (0, _1.validateUpgradeSafety)(functionArgs.buildInfoDir, functionArgs.contract, functionArgs.reference, functionArgs.opts, functionArgs.referenceBuildInfoDirs);
33
34
  console.log(result.explain());
34
35
  process.exitCode = result.ok ? 0 : 1;
35
36
  }
@@ -44,7 +45,7 @@ function parseArgs(args) {
44
45
  'unsafeAllowLinkedLibraries',
45
46
  'requireReference',
46
47
  ],
47
- string: ['unsafeAllow', 'contract', 'reference'],
48
+ string: ['unsafeAllow', 'contract', 'reference', 'referenceBuildInfoDirs'],
48
49
  alias: { h: 'help' },
49
50
  });
50
51
  const extraArgs = parsedArgs._;
@@ -81,6 +82,7 @@ function getFunctionArgs(parsedArgs, extraArgs) {
81
82
  const contract = getAndValidateString(parsedArgs, 'contract');
82
83
  const reference = getAndValidateString(parsedArgs, 'reference');
83
84
  const opts = withDefaults(parsedArgs);
85
+ const referenceBuildInfoDirs = getAndValidateString(parsedArgs, 'referenceBuildInfoDirs')?.split(/,+/);
84
86
  if (contract === undefined) {
85
87
  if (reference !== undefined) {
86
88
  throw new Error('The --reference option can only be used along with the --contract option.');
@@ -89,7 +91,7 @@ function getFunctionArgs(parsedArgs, extraArgs) {
89
91
  throw new Error('The --requireReference option can only be used along with the --contract option.');
90
92
  }
91
93
  }
92
- return { buildInfoDir, contract, reference, opts };
94
+ return { buildInfoDir, contract, reference, opts, referenceBuildInfoDirs };
93
95
  }
94
96
  }
95
97
  function getAndValidateString(parsedArgs, option) {
@@ -112,6 +114,7 @@ function validateOptions(parsedArgs) {
112
114
  'contract',
113
115
  'reference',
114
116
  'requireReference',
117
+ 'referenceBuildInfoDirs',
115
118
  ].includes(key));
116
119
  if (invalidArgs.length > 0) {
117
120
  throw new Error(`Invalid options: ${invalidArgs.join(', ')}`);
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openzeppelin/upgrades-core",
3
- "version": "1.35.1",
3
+ "version": "1.36.0",
4
4
  "description": "",
5
5
  "repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/core",
6
6
  "license": "MIT",
@@ -61,7 +61,7 @@
61
61
  "typescript": "^5.0.0"
62
62
  },
63
63
  "dependencies": {
64
- "@nomicfoundation/slang": "^0.15.1",
64
+ "@nomicfoundation/slang": "^0.16.0",
65
65
  "cbor": "^9.0.0",
66
66
  "chalk": "^4.1.0",
67
67
  "compare-versions": "^6.0.0",
@@ -94,6 +94,21 @@ test('validate - single contract, reference', async t => {
94
94
  t.snapshot(expectation.join('\n'));
95
95
  });
96
96
 
97
+ test('validate - single contract, reference with same build info dir', async t => {
98
+ const temp = await getTempDir(t);
99
+ const buildInfoDir = path.join(temp, 'build-info');
100
+ await fs.mkdir(buildInfoDir);
101
+
102
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:BecomesBadLayout`);
103
+ await fs.writeFile(path.join(buildInfoDir, 'validate.json'), JSON.stringify(buildInfo));
104
+
105
+ const error = await t.throwsAsync(
106
+ execAsync(`${CLI} validate ${buildInfoDir} --contract BecomesBadLayout --reference build-info:StorageV1`),
107
+ );
108
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
109
+ t.snapshot(expectation.join('\n'));
110
+ });
111
+
97
112
  test('validate - single contract, reference, fully qualified names', async t => {
98
113
  const temp = await getTempDir(t);
99
114
  const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:BecomesBadLayout`);
@@ -298,3 +313,262 @@ test('validate - references fully qualified version of ambiguous contract name',
298
313
  ).stdout;
299
314
  t.snapshot(output);
300
315
  });
316
+
317
+ test('validate - references other build info dir by command - ok', async t => {
318
+ const temp = await getTempDir(t);
319
+ const referenceDir = path.join(temp, 'build-info-v1');
320
+ await fs.mkdir(referenceDir);
321
+
322
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
323
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
324
+
325
+ const updatedDir = path.join(temp, 'build-info');
326
+ await fs.mkdir(updatedDir);
327
+
328
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
329
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
330
+
331
+ const output = await execAsync(
332
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract MyContract --reference build-info-v1:MyContract`,
333
+ );
334
+ t.snapshot(output);
335
+ });
336
+
337
+ test('validate - references other build info dir by command - reference not found', async t => {
338
+ const temp = await getTempDir(t);
339
+ const referenceDir = path.join(temp, 'build-info-v1');
340
+ await fs.mkdir(referenceDir);
341
+
342
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
343
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
344
+
345
+ const updatedDir = path.join(temp, 'build-info');
346
+ await fs.mkdir(updatedDir);
347
+
348
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
349
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
350
+
351
+ const error = await t.throwsAsync(
352
+ execAsync(
353
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract MyContract --reference build-info-not-found:MyContract`,
354
+ ),
355
+ );
356
+ t.true(error?.message.includes('Could not find contract build-info-not-found:MyContract.'), error?.message);
357
+ });
358
+
359
+ test('validate - references other build info dir by command - dir not found', async t => {
360
+ const temp = await getTempDir(t);
361
+
362
+ const updatedDir = path.join(temp, 'build-info');
363
+ await fs.mkdir(updatedDir);
364
+
365
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
366
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
367
+
368
+ const error = await t.throwsAsync(
369
+ execAsync(
370
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs build-info-not-found --contract MyContract --reference build-info-not-found:MyContract`,
371
+ ),
372
+ );
373
+ t.true(
374
+ error?.message.includes(
375
+ "The directory 'build-info-not-found' does not exist or does not contain any build info files.",
376
+ ),
377
+ error?.message,
378
+ );
379
+ });
380
+
381
+ test('validate - references other build info dir by command with fully qualified names - ok', async t => {
382
+ const temp = await getTempDir(t);
383
+ const referenceDir = path.join(temp, 'build-info-v1');
384
+ await fs.mkdir(referenceDir);
385
+
386
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
387
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
388
+
389
+ const updatedDir = path.join(temp, 'build-info');
390
+ await fs.mkdir(updatedDir);
391
+
392
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
393
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
394
+
395
+ const output = await execAsync(
396
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract --reference build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`,
397
+ );
398
+ t.snapshot(output);
399
+ });
400
+
401
+ test('validate - references other build info dir by command - bad', async t => {
402
+ const temp = await getTempDir(t);
403
+ const referenceDir = path.join(temp, 'build-info-v1');
404
+ await fs.mkdir(referenceDir);
405
+
406
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
407
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
408
+
409
+ const updatedDir = path.join(temp, 'build-info');
410
+ await fs.mkdir(updatedDir);
411
+
412
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Bad.sol:MyContract`);
413
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
414
+
415
+ const error = await t.throwsAsync(
416
+ execAsync(
417
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract MyContract --reference build-info-v1:MyContract`,
418
+ ),
419
+ );
420
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
421
+ t.snapshot(expectation.join('\n'));
422
+ });
423
+
424
+ test('validate - references other build info dir by command with fully qualified names - bad', async t => {
425
+ const temp = await getTempDir(t);
426
+ const referenceDir = path.join(temp, 'build-info-v1');
427
+ await fs.mkdir(referenceDir);
428
+
429
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
430
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
431
+
432
+ const updatedDir = path.join(temp, 'build-info');
433
+ await fs.mkdir(updatedDir);
434
+
435
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Bad.sol:MyContract`);
436
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
437
+
438
+ const error = await t.throwsAsync(
439
+ execAsync(
440
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract contracts/test/cli/ValidateBuildInfoV2_Bad.sol:MyContract --reference build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`,
441
+ ),
442
+ );
443
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
444
+ t.snapshot(expectation.join('\n'));
445
+ });
446
+
447
+ test('validate - references multiple build info dirs by annotation', async t => {
448
+ const temp = await getTempDir(t);
449
+
450
+ const v1Dir = path.join(temp, 'build-info-v1');
451
+ await fs.mkdir(v1Dir);
452
+ const v1BuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
453
+ await fs.writeFile(path.join(v1Dir, 'validate.json'), JSON.stringify(v1BuildInfo));
454
+
455
+ const v2Dir = path.join(temp, 'build-info-v2');
456
+ await fs.mkdir(v2Dir);
457
+ const v2BuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
458
+ await fs.writeFile(path.join(v2Dir, 'validate.json'), JSON.stringify(v2BuildInfo));
459
+
460
+ const v2BranchDir = path.join(temp, 'build-info-v2-branch');
461
+ await fs.mkdir(v2BranchDir);
462
+ const v2BranchBuildInfoOk = await artifacts.getBuildInfo(
463
+ `contracts/test/cli/ValidateBuildInfoV2_Branch_Ok.sol:MyContract`,
464
+ );
465
+ const v2BranchBuildInfoBad = await artifacts.getBuildInfo(
466
+ `contracts/test/cli/ValidateBuildInfoV2_Branch_Bad.sol:MyContract`,
467
+ );
468
+ await fs.writeFile(path.join(v2BranchDir, 'ok.json'), JSON.stringify(v2BranchBuildInfoOk));
469
+ await fs.writeFile(path.join(v2BranchDir, 'bad.json'), JSON.stringify(v2BranchBuildInfoBad));
470
+
471
+ const error = await t.throwsAsync(
472
+ execAsync(`${CLI} validate ${v2BranchDir} --referenceBuildInfoDirs ${v1Dir},${v2Dir}`),
473
+ );
474
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
475
+ t.snapshot(expectation.join('\n'));
476
+ });
477
+
478
+ test('validate - references other build info dir by annotation - ok', async t => {
479
+ const temp = await getTempDir(t);
480
+ const referenceDir = path.join(temp, 'build-info-v1');
481
+ await fs.mkdir(referenceDir);
482
+
483
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
484
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
485
+
486
+ const updatedDir = path.join(temp, 'build-info');
487
+ await fs.mkdir(updatedDir);
488
+
489
+ const updatedBuildInfo = await artifacts.getBuildInfo(
490
+ `contracts/test/cli/ValidateBuildInfoV2_Annotation_Ok.sol:MyContract`,
491
+ );
492
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
493
+
494
+ const output = await execAsync(
495
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract MyContract`,
496
+ );
497
+ t.snapshot(output);
498
+ });
499
+
500
+ test('validate - references other build info dir by annotation - bad', async t => {
501
+ const temp = await getTempDir(t);
502
+ const referenceDir = path.join(temp, 'build-info-v1');
503
+ await fs.mkdir(referenceDir);
504
+
505
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
506
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
507
+
508
+ const updatedDir = path.join(temp, 'build-info');
509
+ await fs.mkdir(updatedDir);
510
+
511
+ t.assert(updatedDir !== referenceDir);
512
+ const updatedBuildInfo = await artifacts.getBuildInfo(
513
+ `contracts/test/cli/ValidateBuildInfoV2_Annotation_Bad.sol:MyContract`,
514
+ );
515
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
516
+
517
+ const error = await t.throwsAsync(
518
+ execAsync(`${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract MyContract`),
519
+ );
520
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
521
+ t.snapshot(expectation.join('\n'));
522
+ });
523
+
524
+ test('validate - contract must not have build info dir name', async t => {
525
+ const temp = await getTempDir(t);
526
+ const referenceDir = path.join(temp, 'build-info-v1');
527
+ await fs.mkdir(referenceDir);
528
+
529
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
530
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
531
+
532
+ const updatedDir = path.join(temp, 'build-info');
533
+ await fs.mkdir(updatedDir);
534
+
535
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
536
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
537
+
538
+ const error = await t.throwsAsync(
539
+ execAsync(
540
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract build-info:MyContract --reference build-info-v1:MyContract`,
541
+ ),
542
+ );
543
+ t.true(
544
+ error?.message.includes('Contract build-info:MyContract must be specified without a build info directory name'),
545
+ error?.message,
546
+ );
547
+ });
548
+
549
+ test('validate - contract must not have build info dir name - fully qualified', async t => {
550
+ const temp = await getTempDir(t);
551
+ const referenceDir = path.join(temp, 'build-info-v1');
552
+ await fs.mkdir(referenceDir);
553
+
554
+ const referenceBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV1.sol:MyContract`);
555
+ await fs.writeFile(path.join(referenceDir, 'validate.json'), JSON.stringify(referenceBuildInfo));
556
+
557
+ const updatedDir = path.join(temp, 'build-info');
558
+ await fs.mkdir(updatedDir);
559
+
560
+ const updatedBuildInfo = await artifacts.getBuildInfo(`contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract`);
561
+ await fs.writeFile(path.join(updatedDir, 'validate.json'), JSON.stringify(updatedBuildInfo));
562
+
563
+ const error = await t.throwsAsync(
564
+ execAsync(
565
+ `${CLI} validate ${updatedDir} --referenceBuildInfoDirs ${referenceDir} --contract build-info:contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract --reference build-info-v1:MyContract`,
566
+ ),
567
+ );
568
+ t.true(
569
+ error?.message.includes(
570
+ 'Contract build-info:contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract must be specified without a build info directory name',
571
+ ),
572
+ error?.message,
573
+ );
574
+ });