@openzeppelin/upgrades-core 1.26.1 → 1.27.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 (123) hide show
  1. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +126 -0
  2. package/dist/cli/cli.d.ts +3 -0
  3. package/dist/cli/cli.d.ts.map +1 -0
  4. package/dist/cli/cli.js +9 -0
  5. package/dist/cli/cli.js.map +1 -0
  6. package/dist/cli/cli.test.d.ts +2 -0
  7. package/dist/cli/cli.test.d.ts.map +1 -0
  8. package/dist/cli/cli.test.js +52 -0
  9. package/dist/cli/cli.test.js.map +1 -0
  10. package/dist/cli/index.d.ts +4 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +10 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli/validate/build-info-file.d.ts +22 -0
  15. package/dist/cli/validate/build-info-file.d.ts.map +1 -0
  16. package/dist/cli/validate/build-info-file.js +110 -0
  17. package/dist/cli/validate/build-info-file.js.map +1 -0
  18. package/dist/cli/validate/build-info-file.test.d.ts +2 -0
  19. package/dist/cli/validate/build-info-file.test.d.ts.map +1 -0
  20. package/dist/cli/validate/build-info-file.test.js +175 -0
  21. package/dist/cli/validate/build-info-file.test.js.map +1 -0
  22. package/dist/cli/validate/contract-report.d.ts +31 -0
  23. package/dist/cli/validate/contract-report.d.ts.map +1 -0
  24. package/dist/cli/validate/contract-report.js +107 -0
  25. package/dist/cli/validate/contract-report.js.map +1 -0
  26. package/dist/cli/validate/error.d.ts +4 -0
  27. package/dist/cli/validate/error.d.ts.map +1 -0
  28. package/dist/cli/validate/error.js +8 -0
  29. package/dist/cli/validate/error.js.map +1 -0
  30. package/dist/cli/validate/project-report.d.ts +18 -0
  31. package/dist/cli/validate/project-report.d.ts.map +1 -0
  32. package/dist/cli/validate/project-report.js +42 -0
  33. package/dist/cli/validate/project-report.js.map +1 -0
  34. package/dist/cli/validate/project-report.test.d.ts +2 -0
  35. package/dist/cli/validate/project-report.test.d.ts.map +1 -0
  36. package/dist/cli/validate/project-report.test.js +90 -0
  37. package/dist/cli/validate/project-report.test.js.map +1 -0
  38. package/dist/cli/validate/upgradeability-assessment.d.ts +19 -0
  39. package/dist/cli/validate/upgradeability-assessment.d.ts.map +1 -0
  40. package/dist/cli/validate/upgradeability-assessment.js +103 -0
  41. package/dist/cli/validate/upgradeability-assessment.js.map +1 -0
  42. package/dist/cli/validate/validate-upgrade-safety.d.ts +16 -0
  43. package/dist/cli/validate/validate-upgrade-safety.d.ts.map +1 -0
  44. package/dist/cli/validate/validate-upgrade-safety.js +23 -0
  45. package/dist/cli/validate/validate-upgrade-safety.js.map +1 -0
  46. package/dist/cli/validate/validate-upgrade-safety.test.d.ts +2 -0
  47. package/dist/cli/validate/validate-upgrade-safety.test.d.ts.map +1 -0
  48. package/dist/cli/validate/validate-upgrade-safety.test.js +74 -0
  49. package/dist/cli/validate/validate-upgrade-safety.test.js.map +1 -0
  50. package/dist/cli/validate/validations.d.ts +11 -0
  51. package/dist/cli/validate/validations.d.ts.map +1 -0
  52. package/dist/cli/validate/validations.js +40 -0
  53. package/dist/cli/validate/validations.js.map +1 -0
  54. package/dist/cli/validate/validations.test.d.ts +2 -0
  55. package/dist/cli/validate/validations.test.d.ts.map +1 -0
  56. package/dist/cli/validate/validations.test.js +64 -0
  57. package/dist/cli/validate/validations.test.js.map +1 -0
  58. package/dist/cli/validate.d.ts +16 -0
  59. package/dist/cli/validate.d.ts.map +1 -0
  60. package/dist/cli/validate.js +119 -0
  61. package/dist/cli/validate.js.map +1 -0
  62. package/dist/cli/validate.test.d.ts +2 -0
  63. package/dist/cli/validate.test.d.ts.map +1 -0
  64. package/dist/cli/validate.test.js +108 -0
  65. package/dist/cli/validate.test.js.map +1 -0
  66. package/dist/index.d.ts +1 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +5 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/manifest.test.js +2 -1
  71. package/dist/manifest.test.js.map +1 -1
  72. package/dist/utils/annotations.d.ts +16 -0
  73. package/dist/utils/annotations.d.ts.map +1 -0
  74. package/dist/utils/annotations.js +46 -0
  75. package/dist/utils/annotations.js.map +1 -0
  76. package/dist/utils/contract-name.d.ts +2 -0
  77. package/dist/utils/contract-name.d.ts.map +1 -0
  78. package/dist/utils/contract-name.js +8 -0
  79. package/dist/utils/contract-name.js.map +1 -0
  80. package/dist/validate/index.d.ts +1 -1
  81. package/dist/validate/index.d.ts.map +1 -1
  82. package/dist/validate/index.js +2 -1
  83. package/dist/validate/index.js.map +1 -1
  84. package/dist/validate/query.d.ts +8 -1
  85. package/dist/validate/query.d.ts.map +1 -1
  86. package/dist/validate/query.js +16 -3
  87. package/dist/validate/query.js.map +1 -1
  88. package/dist/validate/run.d.ts +1 -4
  89. package/dist/validate/run.d.ts.map +1 -1
  90. package/dist/validate/run.js +8 -38
  91. package/dist/validate/run.js.map +1 -1
  92. package/package.json +9 -3
  93. package/src/cli/cli.test.ts +57 -0
  94. package/src/cli/cli.test.ts.md +138 -0
  95. package/src/cli/cli.test.ts.snap +0 -0
  96. package/src/cli/cli.ts +9 -0
  97. package/src/cli/index.ts +3 -0
  98. package/src/cli/validate/build-info-file.test.ts +211 -0
  99. package/src/cli/validate/build-info-file.ts +145 -0
  100. package/src/cli/validate/contract-report.ts +130 -0
  101. package/src/cli/validate/error.ts +3 -0
  102. package/src/cli/validate/project-report.test.ts +124 -0
  103. package/src/cli/validate/project-report.test.ts.md +40 -0
  104. package/src/cli/validate/project-report.test.ts.snap +0 -0
  105. package/src/cli/validate/project-report.ts +44 -0
  106. package/src/cli/validate/upgradeability-assessment.ts +137 -0
  107. package/src/cli/validate/validate-upgrade-safety.test.ts +102 -0
  108. package/src/cli/validate/validate-upgrade-safety.test.ts.md +98 -0
  109. package/src/cli/validate/validate-upgrade-safety.test.ts.snap +0 -0
  110. package/src/cli/validate/validate-upgrade-safety.ts +29 -0
  111. package/src/cli/validate/validations.test.ts +72 -0
  112. package/src/cli/validate/validations.test.ts.md +87 -0
  113. package/src/cli/validate/validations.test.ts.snap +0 -0
  114. package/src/cli/validate/validations.ts +53 -0
  115. package/src/cli/validate.test.ts +112 -0
  116. package/src/cli/validate.ts +134 -0
  117. package/src/index.ts +2 -0
  118. package/src/manifest.test.ts +2 -1
  119. package/src/utils/annotations.ts +47 -0
  120. package/src/utils/contract-name.ts +3 -0
  121. package/src/validate/index.ts +1 -0
  122. package/src/validate/query.ts +16 -3
  123. package/src/validate/run.ts +5 -41
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getContractReports = exports.UpgradeableContractReport = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const debug_1 = __importDefault(require("../../utils/debug"));
9
+ const __1 = require("../..");
10
+ const upgradeability_assessment_1 = require("./upgradeability-assessment");
11
+ const indent_1 = require("../../utils/indent");
12
+ /**
13
+ * Report for an upgradeable contract.
14
+ * Contains the standalone report, and if there is a reference contract, the reference contract name and storage layout report.
15
+ */
16
+ class UpgradeableContractReport {
17
+ constructor(contract, reference, standaloneReport, storageLayoutReport) {
18
+ this.contract = contract;
19
+ this.reference = reference;
20
+ this.standaloneReport = standaloneReport;
21
+ this.storageLayoutReport = storageLayoutReport;
22
+ }
23
+ get ok() {
24
+ return this.standaloneReport.ok && (this.storageLayoutReport === undefined || this.storageLayoutReport.ok);
25
+ }
26
+ /**
27
+ * Explain any errors in the report.
28
+ */
29
+ explain(color = true) {
30
+ const result = [];
31
+ const chalk = new chalk_1.default.Instance({ level: color && chalk_1.default.supportsColor ? chalk_1.default.supportsColor.level : 0 });
32
+ const icon = this.ok ? chalk.green('✔') : chalk.red('✘');
33
+ if (this.reference === undefined) {
34
+ result.push(` ${icon} ${this.contract}`);
35
+ }
36
+ else {
37
+ result.push(` ${icon} ${this.contract} (upgrades from ${this.reference})`);
38
+ }
39
+ if (!this.standaloneReport.ok) {
40
+ result.push((0, indent_1.indent)(this.standaloneReport.explain(color), 6));
41
+ }
42
+ if (this.storageLayoutReport !== undefined && !this.storageLayoutReport.ok) {
43
+ result.push((0, indent_1.indent)(this.storageLayoutReport.explain(color), 6));
44
+ }
45
+ return result.join('\n\n');
46
+ }
47
+ }
48
+ exports.UpgradeableContractReport = UpgradeableContractReport;
49
+ /**
50
+ * Gets upgradeble contract reports for the upgradeable contracts in the given set of source contracts.
51
+ * Only contracts that are detected as upgradeable will be included in the reports.
52
+ * Reports include upgradeable contracts regardless of whether they pass or fail upgrade safety checks.
53
+ *
54
+ * @param sourceContracts The source contracts to check, which must include all contracts that are referenced by the given contracts. Can also include non-upgradeable contracts, which will be ignored.
55
+ * @param opts The validation options.
56
+ * @returns The upgradeable contract reports.
57
+ */
58
+ function getContractReports(sourceContracts, opts) {
59
+ const upgradeableContractReports = [];
60
+ for (const sourceContract of sourceContracts) {
61
+ const upgradeabilityAssessment = (0, upgradeability_assessment_1.getUpgradeabilityAssessment)(sourceContract, sourceContracts);
62
+ if (upgradeabilityAssessment.upgradeable) {
63
+ const reference = upgradeabilityAssessment.referenceContract;
64
+ const uups = upgradeabilityAssessment.uups;
65
+ const kind = uups ? 'uups' : 'transparent';
66
+ const report = getUpgradeableContractReport(sourceContract, reference, { ...opts, kind: kind });
67
+ if (report !== undefined) {
68
+ upgradeableContractReports.push(report);
69
+ }
70
+ }
71
+ }
72
+ return upgradeableContractReports;
73
+ }
74
+ exports.getContractReports = getContractReports;
75
+ function getUpgradeableContractReport(contract, referenceContract, opts) {
76
+ let version;
77
+ try {
78
+ version = (0, __1.getContractVersion)(contract.validationData, contract.name);
79
+ }
80
+ catch (e) {
81
+ if (e.message.endsWith('is abstract')) {
82
+ // Skip abstract upgradeable contracts - they will be validated as part of their caller contracts
83
+ // for the functions that are in use.
84
+ return undefined;
85
+ }
86
+ else {
87
+ throw e;
88
+ }
89
+ }
90
+ (0, debug_1.default)('Checking: ' + contract.fullyQualifiedName);
91
+ const standaloneReport = getStandaloneReport(contract.validationData, version, opts);
92
+ let reference;
93
+ let storageLayoutReport;
94
+ if (opts.unsafeSkipStorageCheck !== true && referenceContract !== undefined) {
95
+ const layout = (0, __1.getStorageLayout)(contract.validationData, version);
96
+ const referenceVersion = (0, __1.getContractVersion)(referenceContract.validationData, referenceContract.name);
97
+ const referenceLayout = (0, __1.getStorageLayout)(referenceContract.validationData, referenceVersion);
98
+ reference = referenceContract.fullyQualifiedName;
99
+ storageLayoutReport = (0, __1.getStorageUpgradeReport)(referenceLayout, layout, (0, __1.withValidationDefaults)(opts));
100
+ }
101
+ return new UpgradeableContractReport(contract.fullyQualifiedName, reference, standaloneReport, storageLayoutReport);
102
+ }
103
+ function getStandaloneReport(data, version, opts) {
104
+ const errors = (0, __1.getErrors)(data, version, (0, __1.withValidationDefaults)(opts));
105
+ return new __1.UpgradeableContractErrorReport(errors);
106
+ }
107
+ //# sourceMappingURL=contract-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-report.js","sourceRoot":"","sources":["../../../src/cli/validate/contract-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { UpgradesError } from '../..';
2
+ export declare class ValidateCommandError extends UpgradesError {
3
+ }
4
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,qBAAa,oBAAqB,SAAQ,aAAa;CAAG"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidateCommandError = void 0;
4
+ const __1 = require("../..");
5
+ class ValidateCommandError extends __1.UpgradesError {
6
+ }
7
+ exports.ValidateCommandError = ValidateCommandError;
8
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/cli/validate/error.ts"],"names":[],"mappings":";;;AAAA,6BAAsC;AAEtC,MAAa,oBAAqB,SAAQ,iBAAa;CAAG;AAA1D,oDAA0D"}
@@ -0,0 +1,18 @@
1
+ import { UpgradeableContractReport } from './contract-report';
2
+ import { Report } from '../../standalone';
3
+ export declare class ProjectReport implements Report {
4
+ readonly upgradeableContractReports: UpgradeableContractReport[];
5
+ constructor(upgradeableContractReports: UpgradeableContractReport[]);
6
+ get ok(): boolean;
7
+ explain(color?: boolean): string;
8
+ /**
9
+ * Number of contracts that passed upgrade safety checks.
10
+ */
11
+ get numPassed(): number;
12
+ /**
13
+ * Total number of upgradeable contracts detected.
14
+ */
15
+ get numTotal(): number;
16
+ }
17
+ export declare function getProjectReport(upgradeableContractReports: UpgradeableContractReport[]): ProjectReport;
18
+ //# sourceMappingURL=project-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-report.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/project-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,qBAAa,aAAc,YAAW,MAAM;IAC9B,QAAQ,CAAC,0BAA0B,EAAE,yBAAyB,EAAE;gBAAvD,0BAA0B,EAAE,yBAAyB,EAAE;IAE5E,IAAI,EAAE,IAAI,OAAO,CAEhB;IAED,OAAO,CAAC,KAAK,UAAO,GAAG,MAAM;IAgB7B;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;CACF;AAED,wBAAgB,gBAAgB,CAAC,0BAA0B,EAAE,yBAAyB,EAAE,GAAG,aAAa,CAEvG"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProjectReport = exports.ProjectReport = void 0;
4
+ class ProjectReport {
5
+ constructor(upgradeableContractReports) {
6
+ this.upgradeableContractReports = upgradeableContractReports;
7
+ }
8
+ get ok() {
9
+ return this.upgradeableContractReports.every(r => r.ok);
10
+ }
11
+ explain(color = true) {
12
+ if (this.numTotal === 0) {
13
+ return 'No upgradeable contracts detected.';
14
+ }
15
+ else {
16
+ const lines = this.upgradeableContractReports.map(r => r.explain(color));
17
+ const numFailed = this.numTotal - this.numPassed;
18
+ const plural = numFailed === 1 ? '' : 's';
19
+ const status = this.ok ? 'SUCCESS' : 'FAILED';
20
+ lines.push(`${status} (${this.numTotal} upgradeable contract${plural} detected, ${this.numPassed} passed, ${numFailed} failed)`);
21
+ return lines.join('\n\n');
22
+ }
23
+ }
24
+ /**
25
+ * Number of contracts that passed upgrade safety checks.
26
+ */
27
+ get numPassed() {
28
+ return this.upgradeableContractReports.filter(r => r.ok).length;
29
+ }
30
+ /**
31
+ * Total number of upgradeable contracts detected.
32
+ */
33
+ get numTotal() {
34
+ return this.upgradeableContractReports.length;
35
+ }
36
+ }
37
+ exports.ProjectReport = ProjectReport;
38
+ function getProjectReport(upgradeableContractReports) {
39
+ return new ProjectReport(upgradeableContractReports);
40
+ }
41
+ exports.getProjectReport = getProjectReport;
42
+ //# sourceMappingURL=project-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-report.js","sourceRoot":"","sources":["../../../src/cli/validate/project-report.ts"],"names":[],"mappings":";;;AAGA,MAAa,aAAa;IACxB,YAAqB,0BAAuD;QAAvD,+BAA0B,GAA1B,0BAA0B,CAA6B;IAAG,CAAC;IAEhF,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,KAAK,GAAG,IAAI;QAClB,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE;YACvB,OAAO,oCAAoC,CAAC;SAC7C;aAAM;YACL,MAAM,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;YACjD,MAAM,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE9C,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,wBAAwB,MAAM,cAAc,IAAI,CAAC,SAAS,YAAY,SAAS,UAAU,CACrH,CAAC;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC3B;IACH,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC;IAChD,CAAC;CACF;AApCD,sCAoCC;AAED,SAAgB,gBAAgB,CAAC,0BAAuD;IACtF,OAAO,IAAI,aAAa,CAAC,0BAA0B,CAAC,CAAC;AACvD,CAAC;AAFD,4CAEC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-report.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-report.test.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/project-report.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const project_report_1 = require("./project-report");
7
+ const validate_1 = require("../../validate");
8
+ const ava_1 = __importDefault(require("ava"));
9
+ const utils_1 = require("solidity-ast/utils");
10
+ const hardhat_1 = require("hardhat");
11
+ const ast_dereferencer_1 = require("../../ast-dereferencer");
12
+ const extract_1 = require("../../storage/extract");
13
+ const compare_1 = require("../../storage/compare");
14
+ const layout_1 = require("../../storage/layout");
15
+ const contract_report_1 = require("./contract-report");
16
+ const test = ava_1.default;
17
+ const dummyDecodeSrc = () => 'file.sol:1';
18
+ test.before(async (t) => {
19
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo('contracts/test/Storage.sol:Storage1');
20
+ if (buildInfo === undefined) {
21
+ throw new Error('Build info not found');
22
+ }
23
+ const solcOutput = buildInfo.output;
24
+ const contracts = {};
25
+ for (const def of (0, utils_1.findAll)('ContractDefinition', solcOutput.sources['contracts/test/Storage.sol'].ast)) {
26
+ contracts[def.name] = def;
27
+ }
28
+ const deref = (0, ast_dereferencer_1.astDereferencer)(solcOutput);
29
+ t.context.extractStorageLayout = name => (0, extract_1.extractStorageLayout)(contracts[name], dummyDecodeSrc, deref);
30
+ });
31
+ function getLayoutReport(original, updated) {
32
+ const originalDetailed = (0, layout_1.getDetailedLayout)(original);
33
+ const updatedDetailed = (0, layout_1.getDetailedLayout)(updated);
34
+ const comparator = new compare_1.StorageLayoutComparator();
35
+ return comparator.compareLayouts(originalDetailed, updatedDetailed);
36
+ }
37
+ test('get project report - ok - no upgradeable', async (t) => {
38
+ const report = (0, project_report_1.getProjectReport)([]);
39
+ t.true(report.ok);
40
+ t.is(report.numPassed, 0);
41
+ t.is(report.numTotal, 0);
42
+ t.is(report.explain(), 'No upgradeable contracts detected.');
43
+ });
44
+ test('get project report - ok - console', async (t) => {
45
+ const report = (0, project_report_1.getProjectReport)([
46
+ new contract_report_1.UpgradeableContractReport('mypath/MyContract.sol:MyContract1', undefined, new validate_1.UpgradeableContractErrorReport([]), undefined),
47
+ ]);
48
+ t.true(report.ok);
49
+ t.is(report.numPassed, 1);
50
+ t.is(report.numTotal, 1);
51
+ t.regex(report.explain(), /SUCCESS \(1 upgradeable contracts detected, 1 passed, 0 failed\)/);
52
+ });
53
+ test('get project report - errors - console', async (t) => {
54
+ const v1 = t.context.extractStorageLayout('StorageUpgrade_Replace_V1');
55
+ const v2 = t.context.extractStorageLayout('StorageUpgrade_Replace_V2');
56
+ const layoutReport = getLayoutReport(v1, v2);
57
+ const report = (0, project_report_1.getProjectReport)([
58
+ new contract_report_1.UpgradeableContractReport('mypath/MyContract.sol:MyContract', undefined, new validate_1.UpgradeableContractErrorReport([
59
+ {
60
+ src: 'MyContract.sol:10',
61
+ kind: 'missing-public-upgradeto',
62
+ },
63
+ {
64
+ src: 'MyContract.sol:20',
65
+ kind: 'delegatecall',
66
+ },
67
+ ]), undefined),
68
+ new contract_report_1.UpgradeableContractReport('MyContract2', 'MyContract', new validate_1.UpgradeableContractErrorReport([]), layoutReport),
69
+ ]);
70
+ t.false(report.ok);
71
+ t.is(report.numPassed, 0);
72
+ t.is(report.numTotal, 2);
73
+ t.snapshot(report.explain());
74
+ });
75
+ test('get project report - some passed', async (t) => {
76
+ const report = (0, project_report_1.getProjectReport)([
77
+ new contract_report_1.UpgradeableContractReport('mypath/MyContract.sol:MyContract1', undefined, new validate_1.UpgradeableContractErrorReport([
78
+ {
79
+ src: 'MyContract.sol:10',
80
+ kind: 'missing-public-upgradeto',
81
+ },
82
+ ]), undefined),
83
+ new contract_report_1.UpgradeableContractReport('mypath/MyContract.sol:MyContract2', undefined, new validate_1.UpgradeableContractErrorReport([]), undefined),
84
+ ]);
85
+ t.false(report.ok);
86
+ t.is(report.numPassed, 1);
87
+ t.is(report.numTotal, 2);
88
+ t.snapshot(report.explain());
89
+ });
90
+ //# sourceMappingURL=project-report.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-report.test.js","sourceRoot":"","sources":["../../../src/cli/validate/project-report.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { SourceContract } from './validations';
2
+ export declare class ReferenceContractNotFound extends Error {
3
+ /**
4
+ * The contract reference that could not be found.
5
+ */
6
+ readonly reference: string;
7
+ /**
8
+ * The fully qualified name of the contract that referenced the missing contract.
9
+ */
10
+ readonly origin: string;
11
+ constructor(reference: string, origin: string);
12
+ }
13
+ export interface UpgradeabilityAssessment {
14
+ upgradeable: boolean;
15
+ referenceContract?: SourceContract;
16
+ uups?: boolean;
17
+ }
18
+ export declare function getUpgradeabilityAssessment(contract: SourceContract, allContracts: SourceContract[]): UpgradeabilityAssessment;
19
+ //# sourceMappingURL=upgradeability-assessment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeability-assessment.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/upgradeability-assessment.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,qBAAa,yBAA0B,SAAQ,KAAK;IAClD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK9C;AAOD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,cAAc,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,cAAc,EAAE,GAC7B,wBAAwB,CA2B1B"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUpgradeabilityAssessment = exports.ReferenceContractNotFound = void 0;
4
+ const annotations_1 = require("../../utils/annotations");
5
+ const query_1 = require("../../validate/query");
6
+ const error_1 = require("./error");
7
+ class ReferenceContractNotFound extends Error {
8
+ constructor(reference, origin) {
9
+ super(`Could not find contract ${reference} referenced in ${origin}.`);
10
+ this.reference = reference;
11
+ this.origin = origin;
12
+ }
13
+ }
14
+ exports.ReferenceContractNotFound = ReferenceContractNotFound;
15
+ function getUpgradeabilityAssessment(contract, allContracts) {
16
+ const fullContractName = contract.fullyQualifiedName;
17
+ const contractValidation = contract.validationData[fullContractName];
18
+ const isUUPS = (0, query_1.inferUUPS)(contract.validationData, fullContractName);
19
+ const annotationAssessment = getAnnotationAssessment(contract);
20
+ if (annotationAssessment.upgradeable) {
21
+ let referenceContract = undefined;
22
+ let isReferenceUUPS = false;
23
+ if (annotationAssessment.referenceName !== undefined) {
24
+ referenceContract = getReferenceContract(annotationAssessment.referenceName, contract, allContracts);
25
+ isReferenceUUPS = (0, query_1.inferUUPS)(referenceContract.validationData, referenceContract.fullyQualifiedName);
26
+ }
27
+ return {
28
+ upgradeable: true,
29
+ referenceContract: referenceContract,
30
+ uups: isReferenceUUPS || isUUPS,
31
+ };
32
+ }
33
+ else {
34
+ const initializable = (0, query_1.inferInitializable)(contractValidation);
35
+ return {
36
+ upgradeable: initializable || isUUPS,
37
+ uups: isUUPS,
38
+ };
39
+ }
40
+ }
41
+ exports.getUpgradeabilityAssessment = getUpgradeabilityAssessment;
42
+ function getReferenceContract(reference, origin, allContracts) {
43
+ const referenceContracts = allContracts.filter(c => c.fullyQualifiedName === reference || c.name === reference);
44
+ if (referenceContracts.length > 1) {
45
+ throw new error_1.ValidateCommandError(`Found multiple contracts with name ${reference} referenced in ${origin.fullyQualifiedName}.`, () => `This may be caused by old copies of build info files. Clean and recompile your project, then run the command again with the updated files.`);
46
+ }
47
+ else if (referenceContracts.length === 1) {
48
+ return referenceContracts[0];
49
+ }
50
+ else {
51
+ throw new ReferenceContractNotFound(reference, origin.fullyQualifiedName);
52
+ }
53
+ }
54
+ function getAnnotationAssessment(contract) {
55
+ const node = contract.node;
56
+ if ('documentation' in node) {
57
+ const doc = (0, annotations_1.getDocumentation)(node);
58
+ const tag = 'oz-upgrades';
59
+ const hasUpgradeAnnotation = hasAnnotationTag(doc, tag);
60
+ if (hasUpgradeAnnotation) {
61
+ getAndValidateAnnotationArgs(doc, tag, contract, 0);
62
+ }
63
+ const upgradesFrom = getUpgradesFrom(doc, contract);
64
+ if (upgradesFrom !== undefined) {
65
+ return {
66
+ upgradeable: true,
67
+ referenceName: upgradesFrom,
68
+ };
69
+ }
70
+ else {
71
+ return {
72
+ upgradeable: hasUpgradeAnnotation,
73
+ };
74
+ }
75
+ }
76
+ else {
77
+ return {
78
+ upgradeable: false,
79
+ };
80
+ }
81
+ }
82
+ function getAndValidateAnnotationArgs(doc, tag, contract, expectedLength) {
83
+ const annotationArgs = (0, annotations_1.getAnnotationArgs)(doc, tag, undefined);
84
+ if (annotationArgs.length !== expectedLength) {
85
+ throw new error_1.ValidateCommandError(`Invalid number of arguments for @custom:${tag} annotation in contract ${contract.fullyQualifiedName}.`, () => `Found ${annotationArgs.length}, expected ${expectedLength}.`);
86
+ }
87
+ return annotationArgs;
88
+ }
89
+ function hasAnnotationTag(doc, tag) {
90
+ const regex = new RegExp(`^\\s*(@custom:${tag})(\\s|$)`, 'm');
91
+ return regex.test(doc);
92
+ }
93
+ function getUpgradesFrom(doc, contract) {
94
+ const tag = 'oz-upgrades-from';
95
+ if (hasAnnotationTag(doc, tag)) {
96
+ const annotationArgs = getAndValidateAnnotationArgs(doc, tag, contract, 1);
97
+ return annotationArgs[0];
98
+ }
99
+ else {
100
+ return undefined;
101
+ }
102
+ }
103
+ //# sourceMappingURL=upgradeability-assessment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeability-assessment.js","sourceRoot":"","sources":["../../../src/cli/validate/upgradeability-assessment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ValidationOptions } from '../..';
2
+ import { ProjectReport } from './project-report';
3
+ /**
4
+ * Validation options for upgrade safety checks.
5
+ */
6
+ export type ValidateUpgradeSafetyOptions = Omit<ValidationOptions, 'kind'>;
7
+ /**
8
+ * Validates the upgrade safety of all contracts in the build info dir's build info files.
9
+ * Only contracts that are detected as upgradeable will be validated.
10
+ *
11
+ * @param buildInfoDir Absolute path of build info directory, or undefined to use the default Hardhat or Foundry build-info dir.
12
+ * @param opts Validation options, or undefined to use the default validation options.
13
+ * @returns The project report.
14
+ */
15
+ export declare function validateUpgradeSafety(buildInfoDir?: string, opts?: ValidateUpgradeSafetyOptions): Promise<ProjectReport>;
16
+ //# sourceMappingURL=validate-upgrade-safety.d.ts.map
@@ -0,0 +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,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAGnE;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AAE3E;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,CAAC,EAAE,MAAM,EACrB,IAAI,GAAE,4BAAiC,GACtC,OAAO,CAAC,aAAa,CAAC,CAKxB"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateUpgradeSafety = void 0;
4
+ const build_info_file_1 = require("./build-info-file");
5
+ const contract_report_1 = require("./contract-report");
6
+ const project_report_1 = require("./project-report");
7
+ const validations_1 = require("./validations");
8
+ /**
9
+ * Validates the upgrade safety of all contracts in the build info dir's build info files.
10
+ * Only contracts that are detected as upgradeable will be validated.
11
+ *
12
+ * @param buildInfoDir Absolute path of build info directory, or undefined to use the default Hardhat or Foundry build-info dir.
13
+ * @param opts Validation options, or undefined to use the default validation options.
14
+ * @returns The project report.
15
+ */
16
+ async function validateUpgradeSafety(buildInfoDir, opts = {}) {
17
+ const buildInfoFiles = await (0, build_info_file_1.getBuildInfoFiles)(buildInfoDir);
18
+ const sourceContracts = (0, validations_1.validateBuildInfoContracts)(buildInfoFiles);
19
+ const contractReports = (0, contract_report_1.getContractReports)(sourceContracts, opts);
20
+ return (0, project_report_1.getProjectReport)(contractReports);
21
+ }
22
+ exports.validateUpgradeSafety = validateUpgradeSafety;
23
+ //# sourceMappingURL=validate-upgrade-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-upgrade-safety.js","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.ts"],"names":[],"mappings":";;;AAEA,uDAAsD;AACtD,uDAAuD;AACvD,qDAAmE;AACnE,+CAA2D;AAO3D;;;;;;;GAOG;AACI,KAAK,UAAU,qBAAqB,CACzC,YAAqB,EACrB,OAAqC,EAAE;IAEvC,MAAM,cAAc,GAAG,MAAM,IAAA,mCAAiB,EAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAA,wCAA0B,EAAC,cAAc,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,IAAA,oCAAkB,EAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAClE,OAAO,IAAA,iCAAgB,EAAC,eAAe,CAAC,CAAC;AAC3C,CAAC;AARD,sDAQC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-upgrade-safety.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-upgrade-safety.test.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ava_1 = __importDefault(require("ava"));
7
+ const fs_1 = require("fs");
8
+ const rimraf_1 = __importDefault(require("rimraf"));
9
+ const util_1 = __importDefault(require("util"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const hardhat_1 = require("hardhat");
13
+ const validate_upgrade_safety_1 = require("./validate-upgrade-safety");
14
+ const upgradeability_assessment_1 = require("./upgradeability-assessment");
15
+ const rimraf = util_1.default.promisify(rimraf_1.default);
16
+ ava_1.default.before(async () => {
17
+ process.chdir(await fs_1.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'upgrades-core-test-')));
18
+ });
19
+ ava_1.default.after(async () => {
20
+ await rimraf(process.cwd());
21
+ });
22
+ (0, ava_1.default)('validate upgrade safety', async (t) => {
23
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:Safe`);
24
+ await fs_1.promises.mkdir('validate-upgrade-safety');
25
+ await fs_1.promises.writeFile('validate-upgrade-safety/1.json', JSON.stringify(buildInfo));
26
+ const report = await (0, validate_upgrade_safety_1.validateUpgradeSafety)('validate-upgrade-safety');
27
+ t.false(report.ok);
28
+ t.snapshot(report.explain());
29
+ });
30
+ (0, ava_1.default)('ambiguous upgrades-from', async (t) => {
31
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:Safe`);
32
+ await fs_1.promises.mkdir('ambiguous-upgrades-from');
33
+ await fs_1.promises.writeFile('ambiguous-upgrades-from/1.json', JSON.stringify(buildInfo));
34
+ await fs_1.promises.writeFile('ambiguous-upgrades-from/2.json', JSON.stringify(buildInfo));
35
+ const error = await t.throwsAsync((0, validate_upgrade_safety_1.validateUpgradeSafety)('ambiguous-upgrades-from'));
36
+ t.true(error?.message.includes('Found multiple contracts with name'), error?.message);
37
+ });
38
+ (0, ava_1.default)('bad upgrade from 0.8.8 to 0.8.9', async (t) => {
39
+ await fs_1.promises.mkdir('bad-upgrade');
40
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(`contracts/test/cli/Storage088.sol:Storage088`);
41
+ await fs_1.promises.writeFile('bad-upgrade/storage088.json', JSON.stringify(buildInfo));
42
+ const buildInfo2 = await hardhat_1.artifacts.getBuildInfo(`contracts/test/cli/Storage089.sol:Storage089`);
43
+ await fs_1.promises.writeFile('bad-upgrade/storage089.json', JSON.stringify(buildInfo2));
44
+ const report = await (0, validate_upgrade_safety_1.validateUpgradeSafety)('bad-upgrade');
45
+ t.false(report.ok);
46
+ t.snapshot(report.explain());
47
+ });
48
+ (0, ava_1.default)('reference contract not found', async (t) => {
49
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(`contracts/test/cli/Storage089.sol:Storage089`);
50
+ await fs_1.promises.mkdir('ref-not-found');
51
+ await fs_1.promises.writeFile('ref-not-found/storage089.json', JSON.stringify(buildInfo));
52
+ const error = await t.throwsAsync((0, validate_upgrade_safety_1.validateUpgradeSafety)('ref-not-found'));
53
+ t.true(error instanceof upgradeability_assessment_1.ReferenceContractNotFound);
54
+ t.is(error?.message, 'Could not find contract Storage088 referenced in contracts/test/cli/Storage089.sol:Storage089.');
55
+ });
56
+ (0, ava_1.default)('invalid annotation args - upgrades-from', async (t) => {
57
+ const fullyQualifiedName = `contracts/test/cli/InvalidAnnotationArgsUpgradesFrom.sol:InvalidAnnotationArgsUpgradesFrom`;
58
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(fullyQualifiedName);
59
+ await fs_1.promises.mkdir('invalid-annotation-args-upgrades-from');
60
+ await fs_1.promises.writeFile('invalid-annotation-args-upgrades-from/1.json', JSON.stringify(buildInfo));
61
+ const error = await t.throwsAsync((0, validate_upgrade_safety_1.validateUpgradeSafety)('invalid-annotation-args-upgrades-from'));
62
+ t.true(error?.message.includes(`Invalid number of arguments for @custom:oz-upgrades-from annotation in contract ${fullyQualifiedName}.`));
63
+ t.true(error?.message.includes('Found 0, expected 1'));
64
+ });
65
+ (0, ava_1.default)('invalid annotation args - upgrades', async (t) => {
66
+ const fullyQualifiedName = `contracts/test/cli/InvalidAnnotationArgsUpgrades.sol:InvalidAnnotationArgsUpgrades`;
67
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(fullyQualifiedName);
68
+ await fs_1.promises.mkdir('invalid-annotation-args-upgrades');
69
+ await fs_1.promises.writeFile('invalid-annotation-args-upgrades/1.json', JSON.stringify(buildInfo));
70
+ const error = await t.throwsAsync((0, validate_upgrade_safety_1.validateUpgradeSafety)('invalid-annotation-args-upgrades'));
71
+ t.true(error?.message.includes(`Invalid number of arguments for @custom:oz-upgrades annotation in contract ${fullyQualifiedName}.`));
72
+ t.true(error?.message.includes('Found 1, expected 0'));
73
+ });
74
+ //# sourceMappingURL=validate-upgrade-safety.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-upgrade-safety.test.js","sourceRoot":"","sources":["../../../src/cli/validate/validate-upgrade-safety.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ValidationRunData } from '../..';
2
+ import { ContractDefinition } from 'solidity-ast';
3
+ import { BuildInfoFile } from './build-info-file';
4
+ export interface SourceContract {
5
+ node: ContractDefinition;
6
+ name: string;
7
+ fullyQualifiedName: string;
8
+ validationData: ValidationRunData;
9
+ }
10
+ export declare function validateBuildInfoContracts(buildInfoFiles: BuildInfoFile[]): SourceContract[];
11
+ //# sourceMappingURL=validations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validations.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2D,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAKnG,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"}