@openzeppelin/upgrades-core 1.26.2 → 1.27.1

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 (124) hide show
  1. package/LICENSE +22 -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 +116 -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 +150 -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
  124. package/CHANGELOG.md +0 -265
@@ -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":";;;;;AAAA,qDAAoD;AACpD,6CAAgE;AAEhE,8CAAoC;AAEpC,8CAA6C;AAC7C,qCAAoC;AAGpC,6DAAyD;AACzD,mDAA6D;AAC7D,mDAAgE;AAChE,iDAAwE;AACxE,uDAA8D;AAM9D,MAAM,IAAI,GAAG,aAAwB,CAAC;AAEtC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC;AAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;IACpB,MAAM,SAAS,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,qCAAqC,CAAC,CAAC;IACtF,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;KACzC;IACD,MAAM,UAAU,GAAe,SAAS,CAAC,MAAM,CAAC;IAChD,MAAM,SAAS,GAAuC,EAAE,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,IAAA,eAAO,EAAC,oBAAoB,EAAE,UAAU,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,GAAG,CAAC,EAAE;QACrG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;KAC3B;IACD,MAAM,KAAK,GAAG,IAAA,kCAAe,EAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,EAAE,CAAC,IAAA,8BAAoB,EAAC,SAAS,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AACxG,CAAC,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,QAAuB,EAAE,OAAsB;IACtE,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,iCAAuB,EAAE,CAAC;IACjD,OAAO,UAAU,CAAC,cAAc,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC;AAED,IAAI,CAAC,0CAA0C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACzD,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,oCAAoC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAClD,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC;QAC9B,IAAI,2CAAyB,CAC3B,mCAAmC,EACnC,SAAS,EACT,IAAI,yCAA8B,CAAC,EAAE,CAAC,EACtC,SAAS,CACV;KACF,CAAC,CAAC;IAEH,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,kEAAkE,CAAC,CAAC;AAChG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC;QAC9B,IAAI,2CAAyB,CAC3B,kCAAkC,EAClC,SAAS,EACT,IAAI,yCAA8B,CAAC;YACjC;gBACE,GAAG,EAAE,mBAAmB;gBACxB,IAAI,EAAE,0BAA0B;aACjC;YACD;gBACE,GAAG,EAAE,mBAAmB;gBACxB,IAAI,EAAE,cAAc;aACrB;SACF,CAAC,EACF,SAAS,CACV;QACD,IAAI,2CAAyB,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,yCAA8B,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;KACjH,CAAC,CAAC;IAEH,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACjD,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC;QAC9B,IAAI,2CAAyB,CAC3B,mCAAmC,EACnC,SAAS,EACT,IAAI,yCAA8B,CAAC;YACjC;gBACE,GAAG,EAAE,mBAAmB;gBACxB,IAAI,EAAE,0BAA0B;aACjC;SACF,CAAC,EACF,SAAS,CACV;QACD,IAAI,2CAAyB,CAC3B,mCAAmC,EACnC,SAAS,EACT,IAAI,yCAA8B,CAAC,EAAE,CAAC,EACtC,SAAS,CACV;KACF,CAAC,CAAC;IAEH,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
@@ -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"}
@@ -0,0 +1,40 @@
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.validateBuildInfoContracts = void 0;
7
+ const __1 = require("../..");
8
+ const debug_1 = __importDefault(require("../../utils/debug"));
9
+ const utils_1 = require("solidity-ast/utils");
10
+ const contract_name_1 = require("../../utils/contract-name");
11
+ function validateBuildInfoContracts(buildInfoFiles) {
12
+ const sourceContracts = [];
13
+ for (const buildInfoFile of buildInfoFiles) {
14
+ const validations = runValidations(buildInfoFile.input, buildInfoFile.output);
15
+ addContractsFromBuildInfo(buildInfoFile, validations, sourceContracts);
16
+ }
17
+ return sourceContracts;
18
+ }
19
+ exports.validateBuildInfoContracts = validateBuildInfoContracts;
20
+ function runValidations(solcInput, solcOutput) {
21
+ const decodeSrc = (0, __1.solcInputOutputDecoder)(solcInput, solcOutput);
22
+ const validation = (0, __1.validate)(solcOutput, decodeSrc);
23
+ return validation;
24
+ }
25
+ function addContractsFromBuildInfo(buildInfoFile, validationData, sourceContracts) {
26
+ for (const sourcePath in buildInfoFile.output.sources) {
27
+ const ast = buildInfoFile.output.sources[sourcePath].ast;
28
+ for (const contractDef of (0, utils_1.findAll)('ContractDefinition', ast)) {
29
+ const fullyQualifiedName = (0, contract_name_1.getFullyQualifiedName)(sourcePath, contractDef.name);
30
+ (0, debug_1.default)('Found: ' + fullyQualifiedName);
31
+ sourceContracts.push({
32
+ node: contractDef,
33
+ name: contractDef.name,
34
+ fullyQualifiedName,
35
+ validationData: validationData,
36
+ });
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=validations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validations.js","sourceRoot":"","sources":["../../../src/cli/validate/validations.ts"],"names":[],"mappings":";;;;;;AAAA,6BAAmG;AAEnG,8DAAsC;AAEtC,8CAA6C;AAG7C,6DAAkE;AAUlE,SAAgB,0BAA0B,CAAC,cAA+B;IACxE,MAAM,eAAe,GAAqB,EAAE,CAAC;IAC7C,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;QAC1C,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9E,yBAAyB,CAAC,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;KACxE;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAPD,gEAOC;AAED,SAAS,cAAc,CAAC,SAAoB,EAAE,UAAsB;IAClE,MAAM,SAAS,GAAG,IAAA,0BAAsB,EAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAA,YAAQ,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnD,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;QACrD,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;YAC5D,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;SACJ;KACF;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validations.test.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/validations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
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 hardhat_1 = require("hardhat");
8
+ const validations_1 = require("./validations");
9
+ const contract_report_1 = require("./contract-report");
10
+ const test = ava_1.default;
11
+ const SOURCE_FILE = 'contracts/test/cli/Validate.sol';
12
+ test.before(async (t) => {
13
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo(`${SOURCE_FILE}:Safe`);
14
+ if (buildInfo === undefined) {
15
+ t.fail();
16
+ }
17
+ else {
18
+ const sourceContracts = (0, validations_1.validateBuildInfoContracts)([buildInfo]);
19
+ t.context.reports = (0, contract_report_1.getContractReports)(sourceContracts, {});
20
+ }
21
+ });
22
+ function getReport(t, contractName) {
23
+ return t.context.reports.find(r => r.contract === `${SOURCE_FILE}:${contractName}`);
24
+ }
25
+ function assertReport(t, report, valid) {
26
+ if (valid === undefined) {
27
+ t.true(report === undefined);
28
+ }
29
+ else if (valid === true) {
30
+ t.true(report !== undefined);
31
+ t.true(report?.ok);
32
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
33
+ t.regex(report.explain(), /✔/);
34
+ }
35
+ else if (valid === false) {
36
+ t.true(report !== undefined);
37
+ t.false(report?.ok);
38
+ t.snapshot(report?.explain());
39
+ }
40
+ }
41
+ function testValid(name, valid) {
42
+ const expectationString = valid === undefined ? 'ignores' : valid ? 'accepts' : 'rejects';
43
+ const testName = [expectationString, name].join(' ');
44
+ test(testName, t => {
45
+ const report = getReport(t, name);
46
+ assertReport(t, report, valid);
47
+ });
48
+ }
49
+ testValid('Safe', true);
50
+ testValid('MultipleUnsafe', false);
51
+ testValid('NonUpgradeable', undefined);
52
+ testValid('HasInitializer', true);
53
+ testValid('HasUpgradeTo', true);
54
+ testValid('HasUpgradeToConstructorUnsafe', false);
55
+ testValid('InheritsMultipleUnsafe', false);
56
+ testValid('UpgradesFromUUPS', false);
57
+ testValid('UpgradesFromTransparent', true);
58
+ testValid('UnsafeAndStorageLayoutErrors', false);
59
+ testValid('BecomesSafe', true);
60
+ testValid('BecomesBadLayout', false);
61
+ testValid('StillUnsafe', false);
62
+ testValid('AbstractUpgradeable', undefined);
63
+ testValid('InheritsAbstractUpgradeable', true);
64
+ //# sourceMappingURL=validations.test.js.map