@openzeppelin/upgrades-core 1.27.3 → 1.29.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 (125) hide show
  1. package/dist/cli/cli.test.js +93 -3
  2. package/dist/cli/cli.test.js.map +1 -1
  3. package/dist/cli/index.d.ts +1 -1
  4. package/dist/cli/index.d.ts.map +1 -1
  5. package/dist/cli/index.js +2 -2
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/validate/build-info-file.test.js +2 -4
  8. package/dist/cli/validate/build-info-file.test.js.map +1 -1
  9. package/dist/cli/validate/contract-report.d.ts +3 -1
  10. package/dist/cli/validate/contract-report.d.ts.map +1 -1
  11. package/dist/cli/validate/contract-report.js +7 -6
  12. package/dist/cli/validate/contract-report.js.map +1 -1
  13. package/dist/cli/validate/find-contract.d.ts +14 -0
  14. package/dist/cli/validate/find-contract.d.ts.map +1 -0
  15. package/dist/cli/validate/find-contract.js +32 -0
  16. package/dist/cli/validate/find-contract.js.map +1 -0
  17. package/dist/cli/validate/project-report.test.js +1 -2
  18. package/dist/cli/validate/project-report.test.js.map +1 -1
  19. package/dist/cli/validate/upgradeability-assessment.d.ts +1 -12
  20. package/dist/cli/validate/upgradeability-assessment.d.ts.map +1 -1
  21. package/dist/cli/validate/upgradeability-assessment.js +17 -40
  22. package/dist/cli/validate/upgradeability-assessment.js.map +1 -1
  23. package/dist/cli/validate/validate-upgrade-safety.d.ts +8 -1
  24. package/dist/cli/validate/validate-upgrade-safety.d.ts.map +1 -1
  25. package/dist/cli/validate/validate-upgrade-safety.js +20 -2
  26. package/dist/cli/validate/validate-upgrade-safety.js.map +1 -1
  27. package/dist/cli/validate/validate-upgrade-safety.test.js +4 -6
  28. package/dist/cli/validate/validate-upgrade-safety.test.js.map +1 -1
  29. package/dist/cli/validate.d.ts +2 -0
  30. package/dist/cli/validate.d.ts.map +1 -1
  31. package/dist/cli/validate.js +19 -3
  32. package/dist/cli/validate.js.map +1 -1
  33. package/dist/cli/validate.test.js.map +1 -1
  34. package/dist/deployment.d.ts.map +1 -1
  35. package/dist/deployment.js.map +1 -1
  36. package/dist/impl-store.test.js +2 -4
  37. package/dist/impl-store.test.js.map +1 -1
  38. package/dist/scripts/migrate-oz-cli-project.test.js +2 -4
  39. package/dist/scripts/migrate-oz-cli-project.test.js.map +1 -1
  40. package/dist/standalone.d.ts.map +1 -1
  41. package/dist/standalone.js.map +1 -1
  42. package/dist/storage/compare.d.ts.map +1 -1
  43. package/dist/storage/compare.js.map +1 -1
  44. package/dist/storage/extract.d.ts +1 -1
  45. package/dist/storage/extract.d.ts.map +1 -1
  46. package/dist/storage/extract.js.map +1 -1
  47. package/dist/storage/report-gap.test.js +1 -2
  48. package/dist/storage/report-gap.test.js.map +1 -1
  49. package/dist/storage/report-rename-retype.test.js +1 -2
  50. package/dist/storage/report-rename-retype.test.js.map +1 -1
  51. package/dist/storage/report-retype-from-contract.test.js +1 -2
  52. package/dist/storage/report-retype-from-contract.test.js.map +1 -1
  53. package/dist/storage/report.test.js +1 -2
  54. package/dist/storage/report.test.js.map +1 -1
  55. package/dist/storage-0.8.test.js +1 -2
  56. package/dist/storage-0.8.test.js.map +1 -1
  57. package/dist/storage-memory-0.5.test.js +1 -2
  58. package/dist/storage-memory-0.5.test.js.map +1 -1
  59. package/dist/storage.test.js +1 -2
  60. package/dist/storage.test.js.map +1 -1
  61. package/dist/utils/function.d.ts +1 -1
  62. package/dist/utils/function.d.ts.map +1 -1
  63. package/dist/utils/function.test.js +1 -2
  64. package/dist/utils/function.test.js.map +1 -1
  65. package/dist/validate/error.d.ts.map +1 -1
  66. package/dist/validate/error.js.map +1 -1
  67. package/dist/validate/overrides.js +1 -1
  68. package/dist/validate/overrides.js.map +1 -1
  69. package/dist/validate/query.d.ts.map +1 -1
  70. package/dist/validate/query.js +3 -1
  71. package/dist/validate/query.js.map +1 -1
  72. package/dist/validate/report.js +2 -2
  73. package/dist/validate/report.js.map +1 -1
  74. package/dist/validate/run.d.ts +1 -1
  75. package/dist/validate/run.d.ts.map +1 -1
  76. package/dist/validate/run.js +1 -2
  77. package/dist/validate/run.js.map +1 -1
  78. package/dist/validate.test.js +3 -0
  79. package/dist/validate.test.js.map +1 -1
  80. package/package.json +7 -7
  81. package/src/cli/cli.test.ts +131 -2
  82. package/src/cli/cli.test.ts.md +96 -2
  83. package/src/cli/cli.test.ts.snap +0 -0
  84. package/src/cli/index.ts +1 -1
  85. package/src/cli/validate/build-info-file.test.ts +1 -4
  86. package/src/cli/validate/contract-report.ts +19 -7
  87. package/src/cli/validate/find-contract.ts +44 -0
  88. package/src/cli/validate/project-report.test.ts +1 -2
  89. package/src/cli/validate/project-report.test.ts.md +4 -4
  90. package/src/cli/validate/project-report.test.ts.snap +0 -0
  91. package/src/cli/validate/upgradeability-assessment.ts +18 -50
  92. package/src/cli/validate/validate-upgrade-safety.test.ts +2 -5
  93. package/src/cli/validate/validate-upgrade-safety.test.ts.md +2 -2
  94. package/src/cli/validate/validate-upgrade-safety.test.ts.snap +0 -0
  95. package/src/cli/validate/validate-upgrade-safety.ts +32 -2
  96. package/src/cli/validate/validations.test.ts.md +2 -2
  97. package/src/cli/validate/validations.test.ts.snap +0 -0
  98. package/src/cli/validate.test.ts +1 -1
  99. package/src/cli/validate.ts +28 -4
  100. package/src/deployment.ts +5 -1
  101. package/src/impl-store.test.ts +1 -4
  102. package/src/scripts/migrate-oz-cli-project.test.ts +1 -3
  103. package/src/standalone.ts +6 -1
  104. package/src/storage/compare.ts +4 -1
  105. package/src/storage/extract.ts +1 -2
  106. package/src/storage/report-gap.test.ts +1 -2
  107. package/src/storage/report-rename-retype.test.ts +1 -2
  108. package/src/storage/report-retype-from-contract.test.ts +1 -2
  109. package/src/storage/report.test.ts +1 -2
  110. package/src/storage-0.8.test.ts +1 -2
  111. package/src/storage-memory-0.5.test.ts +1 -2
  112. package/src/storage.test.ts +1 -2
  113. package/src/utils/function.test.ts +1 -2
  114. package/src/utils/function.ts +1 -1
  115. package/src/validate/error.ts +4 -1
  116. package/src/validate/overrides.ts +1 -1
  117. package/src/validate/query.ts +5 -1
  118. package/src/validate/report.ts +3 -2
  119. package/src/validate/run.ts +2 -3
  120. package/src/validate.test.ts +3 -0
  121. package/dist/ast-dereferencer.d.ts +0 -8
  122. package/dist/ast-dereferencer.d.ts.map +0 -1
  123. package/dist/ast-dereferencer.js +0 -29
  124. package/dist/ast-dereferencer.js.map +0 -1
  125. package/src/ast-dereferencer.ts +0 -42
@@ -1 +1 @@
1
- {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../src/validate.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../src/validate.test.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.27.3",
3
+ "version": "1.29.0",
4
4
  "description": "",
5
5
  "repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/core",
6
6
  "license": "MIT",
@@ -36,14 +36,14 @@
36
36
  "openzeppelin-upgrades-core": "./dist/cli/cli.js"
37
37
  },
38
38
  "devDependencies": {
39
- "@ava/typescript": "^2.0.0",
39
+ "@ava/typescript": "^4.0.0",
40
40
  "@nomicfoundation/hardhat-ethers": "^3.0.0",
41
41
  "@openzeppelin/contracts": "4.8.3",
42
42
  "@openzeppelin/contracts-upgradeable": "4.8.3",
43
43
  "@types/cbor": "^5.0.0",
44
44
  "@types/debug": "^4.1.5",
45
45
  "@types/mocha": "^7.0.2",
46
- "@types/node": "^10.17.26",
46
+ "@types/node": "^16.11.7",
47
47
  "@types/proper-lockfile": "^4.1.1",
48
48
  "@types/rimraf": "^3.0.0",
49
49
  "@types/sinon": "^10.0.13",
@@ -51,18 +51,18 @@
51
51
  "dotenv": "^16.0.0",
52
52
  "fgbg": "^0.1.4",
53
53
  "hardhat": "^2.0.2",
54
- "rimraf": "^3.0.2",
54
+ "rimraf": "^5.0.0",
55
55
  "typescript": "^4.0.0"
56
56
  },
57
57
  "dependencies": {
58
- "cbor": "^8.0.0",
58
+ "cbor": "^9.0.0",
59
59
  "chalk": "^4.1.0",
60
60
  "compare-versions": "^6.0.0",
61
61
  "debug": "^4.1.1",
62
62
  "ethereumjs-util": "^7.0.3",
63
63
  "minimist": "^1.2.7",
64
64
  "proper-lockfile": "^4.1.1",
65
- "solidity-ast": "^0.4.15"
65
+ "solidity-ast": "^0.4.26"
66
66
  },
67
- "gitHead": "d1513992c58106b44967e42cb9f8cb2621d5a300"
67
+ "gitHead": "d5394ba966d4747550cd20f865264ccdb6b6ffed"
68
68
  }
@@ -4,11 +4,10 @@ import { exec } from 'child_process';
4
4
  import { promises as fs } from 'fs';
5
5
  import path from 'path';
6
6
  import os from 'os';
7
- import rimrafAsync from 'rimraf';
7
+ import { rimraf } from 'rimraf';
8
8
  import { artifacts } from 'hardhat';
9
9
 
10
10
  const execAsync = promisify(exec);
11
- const rimraf = promisify(rimrafAsync);
12
11
 
13
12
  const CLI = 'node dist/cli/cli.js';
14
13
 
@@ -38,6 +37,136 @@ test('validate - errors', async t => {
38
37
  t.snapshot(expectation.join('\n'));
39
38
  });
40
39
 
40
+ test('validate - single contract', async t => {
41
+ // This should check even though the contract is not detected as upgradeable, since the --contract option was used.
42
+ const temp = await getTempDir(t);
43
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:NonUpgradeable`);
44
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
45
+
46
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --contract NonUpgradeable`));
47
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
48
+ t.snapshot(expectation.join('\n'));
49
+ });
50
+
51
+ test('validate - single contract, has upgrades-from', async t => {
52
+ const temp = await getTempDir(t);
53
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors`);
54
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
55
+
56
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --contract UnsafeAndStorageLayoutErrors`));
57
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
58
+ t.snapshot(expectation.join('\n'));
59
+ });
60
+
61
+ test('validate - single contract, reference overrides upgrades-from', async t => {
62
+ const temp = await getTempDir(t);
63
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors`);
64
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
65
+
66
+ const error = await t.throwsAsync(
67
+ execAsync(`${CLI} validate ${temp} --contract UnsafeAndStorageLayoutErrors --reference Safe`),
68
+ );
69
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
70
+ t.snapshot(expectation.join('\n'));
71
+ });
72
+
73
+ test('validate - single contract, reference is uups, overrides upgrades-from', async t => {
74
+ const temp = await getTempDir(t);
75
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors`);
76
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
77
+
78
+ const error = await t.throwsAsync(
79
+ execAsync(`${CLI} validate ${temp} --contract BecomesBadLayout --reference HasUpgradeTo`),
80
+ );
81
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
82
+ t.snapshot(expectation.join('\n'));
83
+ });
84
+
85
+ test('validate - single contract, reference', async t => {
86
+ const temp = await getTempDir(t);
87
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:BecomesBadLayout`);
88
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
89
+
90
+ const error = await t.throwsAsync(
91
+ execAsync(`${CLI} validate ${temp} --contract BecomesBadLayout --reference StorageV1`),
92
+ );
93
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
94
+ t.snapshot(expectation.join('\n'));
95
+ });
96
+
97
+ test('validate - single contract, reference, fully qualified names', async t => {
98
+ const temp = await getTempDir(t);
99
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:BecomesBadLayout`);
100
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
101
+
102
+ const error = await t.throwsAsync(
103
+ execAsync(
104
+ `${CLI} validate ${temp} --contract contracts/test/cli/Validate.sol:BecomesBadLayout --reference contracts/test/cli/Validate.sol:StorageV1`,
105
+ ),
106
+ );
107
+ const expectation: string[] = [`Stdout: ${(error as any).stdout}`, `Stderr: ${(error as any).stderr}`];
108
+ t.snapshot(expectation.join('\n'));
109
+ });
110
+
111
+ test('validate - reference without contract option', async t => {
112
+ const temp = await getTempDir(t);
113
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:StorageV1`);
114
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
115
+
116
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --reference StorageV1`));
117
+ t.true(
118
+ error?.message.includes('The --reference option can only be used along with the --contract option.'),
119
+ error?.message,
120
+ );
121
+ });
122
+
123
+ test('validate - emtpy contract string', async t => {
124
+ const temp = await getTempDir(t);
125
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:StorageV1`);
126
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
127
+
128
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --contract --reference StorageV1`));
129
+ t.true(error?.message.includes('Invalid option: --contract cannot be empty'), error?.message);
130
+ });
131
+
132
+ test('validate - blank contract string', async t => {
133
+ const temp = await getTempDir(t);
134
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:StorageV1`);
135
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
136
+
137
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --contract ' ' --reference StorageV1`));
138
+ t.true(error?.message.includes('Invalid option: --contract cannot be empty'), error?.message);
139
+ });
140
+
141
+ test('validate - empty reference string', async t => {
142
+ const temp = await getTempDir(t);
143
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:StorageV1`);
144
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
145
+
146
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --contract StorageV1 --reference`));
147
+ t.true(error?.message.includes('Invalid option: --reference cannot be empty'), error?.message);
148
+ });
149
+
150
+ test('validate - single contract not found', async t => {
151
+ const temp = await getTempDir(t);
152
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:BecomesBadLayout`);
153
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
154
+
155
+ const error = await t.throwsAsync(execAsync(`${CLI} validate ${temp} --contract NonExistent`));
156
+ t.true(error?.message.includes('Could not find contract NonExistent.'), error?.message);
157
+ });
158
+
159
+ test('validate - reference not found', async t => {
160
+ const temp = await getTempDir(t);
161
+ const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Validate.sol:BecomesBadLayout`);
162
+ await fs.writeFile(path.join(temp, 'validate.json'), JSON.stringify(buildInfo));
163
+
164
+ const error = await t.throwsAsync(
165
+ execAsync(`${CLI} validate ${temp} --contract BecomesBadLayout --reference NonExistent`),
166
+ );
167
+ t.true(error?.message.includes('Could not find contract NonExistent.'), error?.message);
168
+ });
169
+
41
170
  test('validate - no upgradeable', async t => {
42
171
  const temp = await getTempDir(t);
43
172
  const buildInfo = await artifacts.getBuildInfo(`contracts/test/cli/Storage088.sol:Storage088`);
@@ -16,6 +16,8 @@ Generated by [AVA](https://avajs.dev).
16
16
  <BUILD_INFO_DIR> Optional path to the build info directory which contains JSON files with Solidity compiler input and output. Defaults to 'artifacts/build-info' for Hardhat projects or 'out/build-info' for Foundry projects. If your project uses a custom output directory, you must specify its build info directory here.␊
17
17
  ␊
18
18
  Options:␊
19
+ --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.␊
20
+ --reference <REFERENCE_CONTRACT> The name or fully qualified name of the reference contract to use for storage layout comparisons. Can only be used along with the --contract option. If not specified, uses the @custom:oz-upgrades-from annotation in the contract that is being validated.␊
19
21
  --unsafeAllow "<VALIDATION_ERRORS>" Selectively disable one or more validation errors. Comma-separated list with one or more of the following: state-variable-assignment, state-variable-immutable, external-library-linking, struct-definition, enum-definition, constructor, delegatecall, selfdestruct, missing-public-upgradeto␊
20
22
  --unsafeAllowRenames Configure storage layout check to allow variable renaming.␊
21
23
  --unsafeSkipStorageCheck Skips checking for storage layout compatibility errors. This is a dangerous option meant to be used as a last resort.␊
@@ -33,6 +35,8 @@ Generated by [AVA](https://avajs.dev).
33
35
  <BUILD_INFO_DIR> Optional path to the build info directory which contains JSON files with Solidity compiler input and output. Defaults to 'artifacts/build-info' for Hardhat projects or 'out/build-info' for Foundry projects. If your project uses a custom output directory, you must specify its build info directory here.␊
34
36
  ␊
35
37
  Options:␊
38
+ --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.␊
39
+ --reference <REFERENCE_CONTRACT> The name or fully qualified name of the reference contract to use for storage layout comparisons. Can only be used along with the --contract option. If not specified, uses the @custom:oz-upgrades-from annotation in the contract that is being validated.␊
36
40
  --unsafeAllow "<VALIDATION_ERRORS>" Selectively disable one or more validation errors. Comma-separated list with one or more of the following: state-variable-assignment, state-variable-immutable, external-library-linking, struct-definition, enum-definition, constructor, delegatecall, selfdestruct, missing-public-upgradeto␊
37
41
  --unsafeAllowRenames Configure storage layout check to allow variable renaming.␊
38
42
  --unsafeSkipStorageCheck Skips checking for storage layout compatibility errors. This is a dangerous option meant to be used as a last resort.␊
@@ -78,8 +82,8 @@ Generated by [AVA](https://avajs.dev).
78
82
  ␊
79
83
  ✘ contracts/test/cli/Validate.sol:UpgradesFromUUPS (upgrades from contracts/test/cli/Validate.sol:HasUpgradeTo)␊
80
84
  ␊
81
- contracts/test/cli/Validate.sol:72: Implementation is missing a public \`upgradeTo(address)\` function␊
82
- Inherit UUPSUpgradeable to include this function in your contract␊
85
+ contracts/test/cli/Validate.sol:72: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
86
+ Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
83
87
  @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
84
88
  https://zpl.in/upgrades/error-008␊
85
89
  ␊
@@ -121,6 +125,96 @@ Generated by [AVA](https://avajs.dev).
121
125
  ␊
122
126
  Stderr: `
123
127
 
128
+ ## validate - single contract
129
+
130
+ > Snapshot 1
131
+
132
+ `Stdout: ✘ contracts/test/cli/Validate.sol:NonUpgradeable␊
133
+ ␊
134
+ contracts/test/cli/Validate.sol:14: Use of selfdestruct is not allowed␊
135
+ https://zpl.in/upgrades/error-003␊
136
+ ␊
137
+ FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
138
+ ␊
139
+ Stderr: `
140
+
141
+ ## validate - single contract, has upgrades-from
142
+
143
+ > Snapshot 1
144
+
145
+ `Stdout: ✘ contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
146
+ ␊
147
+ contracts/test/cli/Validate.sol:97: Use of selfdestruct is not allowed␊
148
+ https://zpl.in/upgrades/error-003␊
149
+ ␊
150
+ contracts/test/cli/Validate.sol:94: Layout changed for \`__gap\` (uint256[49] -> uint256[49])␊
151
+ - Slot changed from 1 to 2␊
152
+ > Set __gap array to size 48␊
153
+ ␊
154
+ FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
155
+ ␊
156
+ Stderr: `
157
+
158
+ ## validate - single contract, reference overrides upgrades-from
159
+
160
+ > Snapshot 1
161
+
162
+ `Stdout: ✘ contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors (upgrades from contracts/test/cli/Validate.sol:Safe)␊
163
+ ␊
164
+ contracts/test/cli/Validate.sol:97: Use of selfdestruct is not allowed␊
165
+ https://zpl.in/upgrades/error-003␊
166
+ ␊
167
+ FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
168
+ ␊
169
+ Stderr: `
170
+
171
+ ## validate - single contract, reference is uups, overrides upgrades-from
172
+
173
+ > Snapshot 1
174
+
175
+ `Stdout: ✘ contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:HasUpgradeTo)␊
176
+ ␊
177
+ contracts/test/cli/Validate.sol:111: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
178
+ Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
179
+ @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
180
+ https://zpl.in/upgrades/error-008␊
181
+ ␊
182
+ FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
183
+ ␊
184
+ Stderr: `
185
+
186
+ ## validate - single contract, reference
187
+
188
+ > Snapshot 1
189
+
190
+ `Stdout: ✘ contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
191
+ ␊
192
+ StorageV1: Deleted \`x\`␊
193
+ > Keep the variable even if unused␊
194
+ ␊
195
+ StorageV1: Deleted \`__gap\`␊
196
+ > Keep the variable even if unused␊
197
+ ␊
198
+ FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
199
+ ␊
200
+ Stderr: `
201
+
202
+ ## validate - single contract, reference, fully qualified names
203
+
204
+ > Snapshot 1
205
+
206
+ `Stdout: ✘ contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
207
+ ␊
208
+ StorageV1: Deleted \`x\`␊
209
+ > Keep the variable even if unused␊
210
+ ␊
211
+ StorageV1: Deleted \`__gap\`␊
212
+ > Keep the variable even if unused␊
213
+ ␊
214
+ FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
215
+ ␊
216
+ Stderr: `
217
+
124
218
  ## validate - no upgradeable
125
219
 
126
220
  > Snapshot 1
Binary file
package/src/cli/index.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { ValidateUpgradeSafetyOptions, validateUpgradeSafety } from './validate/validate-upgrade-safety';
2
2
  export { ProjectReport } from './validate/project-report';
3
- export { ReferenceContractNotFound } from './validate/upgradeability-assessment';
3
+ export { ReferenceContractNotFound } from './validate/find-contract';
@@ -1,14 +1,11 @@
1
1
  import test, { ExecutionContext } from 'ava';
2
2
 
3
3
  import { promises as fs } from 'fs';
4
- import rimrafAsync from 'rimraf';
5
- import util from 'util';
4
+ import { rimraf } from 'rimraf';
6
5
  import path from 'path';
7
6
  import os from 'os';
8
7
  import { BuildInfoFile, getBuildInfoFiles } from './build-info-file';
9
8
 
10
- const rimraf = util.promisify(rimrafAsync);
11
-
12
9
  test.beforeEach(async t => {
13
10
  process.chdir(await fs.mkdtemp(path.join(os.tmpdir(), `upgrades-core-test-${t.title.replace(/\s/g, '-')}-`)));
14
11
  });
@@ -17,6 +17,7 @@ import { getUpgradeabilityAssessment } from './upgradeability-assessment';
17
17
  import { SourceContract } from './validations';
18
18
  import { LayoutCompatibilityReport } from '../../storage/report';
19
19
  import { indent } from '../../utils/indent';
20
+ import { SpecifiedContracts } from './validate-upgrade-safety';
20
21
 
21
22
  /**
22
23
  * Report for an upgradeable contract.
@@ -63,17 +64,28 @@ export class UpgradeableContractReport implements Report {
63
64
  *
64
65
  * @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.
65
66
  * @param opts The validation options.
67
+ * @param specifiedContracts If provided, only the specified contract (upgrading from its reference contract) will be reported.
66
68
  * @returns The upgradeable contract reports.
67
69
  */
68
- export function getContractReports(sourceContracts: SourceContract[], opts: ValidateUpgradeSafetyOptions) {
70
+ export function getContractReports(
71
+ sourceContracts: SourceContract[],
72
+ opts: ValidateUpgradeSafetyOptions,
73
+ specifiedContracts?: SpecifiedContracts,
74
+ ) {
69
75
  const upgradeableContractReports: UpgradeableContractReport[] = [];
70
- for (const sourceContract of sourceContracts) {
71
- const upgradeabilityAssessment = getUpgradeabilityAssessment(sourceContract, sourceContracts);
72
- if (upgradeabilityAssessment.upgradeable) {
73
- const reference = upgradeabilityAssessment.referenceContract;
74
- const uups = upgradeabilityAssessment.uups;
75
- const kind = uups ? 'uups' : 'transparent';
76
76
 
77
+ const contractsToReport: SourceContract[] =
78
+ specifiedContracts !== undefined ? [specifiedContracts.contract] : sourceContracts;
79
+
80
+ for (const sourceContract of contractsToReport) {
81
+ const upgradeabilityAssessment = getUpgradeabilityAssessment(
82
+ sourceContract,
83
+ sourceContracts,
84
+ specifiedContracts?.reference,
85
+ );
86
+ if (specifiedContracts !== undefined || upgradeabilityAssessment.upgradeable) {
87
+ const reference = upgradeabilityAssessment.referenceContract;
88
+ const kind = upgradeabilityAssessment.uups ? 'uups' : 'transparent';
77
89
  const report = getUpgradeableContractReport(sourceContract, reference, { ...opts, kind: kind });
78
90
  if (report !== undefined) {
79
91
  upgradeableContractReports.push(report);
@@ -0,0 +1,44 @@
1
+ import { ValidateCommandError } from './error';
2
+ import { SourceContract } from './validations';
3
+
4
+ export class ReferenceContractNotFound extends Error {
5
+ /**
6
+ * The contract reference that could not be found.
7
+ */
8
+ readonly reference: string;
9
+
10
+ /**
11
+ * The fully qualified name of the contract that referenced the missing contract.
12
+ */
13
+ readonly origin?: string;
14
+
15
+ constructor(reference: string, origin?: string) {
16
+ const msg =
17
+ origin !== undefined
18
+ ? `Could not find contract ${reference} referenced in ${origin}.`
19
+ : `Could not find contract ${reference}.`;
20
+ super(msg);
21
+ this.reference = reference;
22
+ this.origin = origin;
23
+ }
24
+ }
25
+
26
+ export function findContract(contractName: string, origin: SourceContract | undefined, allContracts: SourceContract[]) {
27
+ const foundContracts = allContracts.filter(c => c.fullyQualifiedName === contractName || c.name === contractName);
28
+
29
+ if (foundContracts.length > 1) {
30
+ const msg =
31
+ origin !== undefined
32
+ ? `Found multiple contracts with name ${contractName} referenced in ${origin.fullyQualifiedName}.`
33
+ : `Found multiple contracts with name ${contractName}.`;
34
+ throw new ValidateCommandError(
35
+ msg,
36
+ () =>
37
+ `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.`,
38
+ );
39
+ } else if (foundContracts.length === 1) {
40
+ return foundContracts[0];
41
+ } else {
42
+ throw new ReferenceContractNotFound(contractName, origin?.fullyQualifiedName);
43
+ }
44
+ }
@@ -3,11 +3,10 @@ import { UpgradeableContractErrorReport } from '../../validate';
3
3
 
4
4
  import _test, { TestFn } from 'ava';
5
5
  import { ContractDefinition } from 'solidity-ast';
6
- import { findAll } from 'solidity-ast/utils';
6
+ import { findAll, astDereferencer } from 'solidity-ast/utils';
7
7
  import { artifacts } from 'hardhat';
8
8
 
9
9
  import { SolcOutput } from '../../solc-api';
10
- import { astDereferencer } from '../../ast-dereferencer';
11
10
  import { extractStorageLayout } from '../../storage/extract';
12
11
  import { StorageLayoutComparator } from '../../storage/compare';
13
12
  import { StorageLayout, getDetailedLayout } from '../../storage/layout';
@@ -10,8 +10,8 @@ Generated by [AVA](https://avajs.dev).
10
10
 
11
11
  ` ✘ mypath/MyContract.sol:MyContract␊
12
12
  ␊
13
- MyContract.sol:10: Implementation is missing a public \`upgradeTo(address)\` function␊
14
- Inherit UUPSUpgradeable to include this function in your contract␊
13
+ MyContract.sol:10: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
14
+ Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
15
15
  @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
16
16
  https://zpl.in/upgrades/error-008␊
17
17
  ␊
@@ -30,8 +30,8 @@ Generated by [AVA](https://avajs.dev).
30
30
 
31
31
  ` ✘ mypath/MyContract.sol:MyContract1␊
32
32
  ␊
33
- MyContract.sol:10: Implementation is missing a public \`upgradeTo(address)\` function␊
34
- Inherit UUPSUpgradeable to include this function in your contract␊
33
+ MyContract.sol:10: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
34
+ Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
35
35
  @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
36
36
  https://zpl.in/upgrades/error-008␊
37
37
  ␊
@@ -1,26 +1,9 @@
1
1
  import { getAnnotationArgs, getDocumentation } from '../../utils/annotations';
2
2
  import { inferInitializable, inferUUPS } from '../../validate/query';
3
3
  import { ValidateCommandError } from './error';
4
+ import { findContract } from './find-contract';
4
5
  import { SourceContract } from './validations';
5
6
 
6
- export class ReferenceContractNotFound extends Error {
7
- /**
8
- * The contract reference that could not be found.
9
- */
10
- readonly reference: string;
11
-
12
- /**
13
- * The fully qualified name of the contract that referenced the missing contract.
14
- */
15
- readonly origin: string;
16
-
17
- constructor(reference: string, origin: string) {
18
- super(`Could not find contract ${reference} referenced in ${origin}.`);
19
- this.reference = reference;
20
- this.origin = origin;
21
- }
22
- }
23
-
24
7
  interface AnnotationAssessment {
25
8
  upgradeable: boolean;
26
9
  referenceName?: string;
@@ -35,6 +18,7 @@ export interface UpgradeabilityAssessment {
35
18
  export function getUpgradeabilityAssessment(
36
19
  contract: SourceContract,
37
20
  allContracts: SourceContract[],
21
+ overrideReferenceContract?: SourceContract,
38
22
  ): UpgradeabilityAssessment {
39
23
  const fullContractName = contract.fullyQualifiedName;
40
24
  const contractValidation = contract.validationData[fullContractName];
@@ -42,42 +26,26 @@ export function getUpgradeabilityAssessment(
42
26
  const isUUPS = inferUUPS(contract.validationData, fullContractName);
43
27
 
44
28
  const annotationAssessment = getAnnotationAssessment(contract);
45
- if (annotationAssessment.upgradeable) {
46
- let referenceContract = undefined;
47
- let isReferenceUUPS = false;
48
- if (annotationAssessment.referenceName !== undefined) {
49
- referenceContract = getReferenceContract(annotationAssessment.referenceName, contract, allContracts);
50
- isReferenceUUPS = inferUUPS(referenceContract.validationData, referenceContract.fullyQualifiedName);
51
- }
52
29
 
53
- return {
54
- upgradeable: true,
55
- referenceContract: referenceContract,
56
- uups: isReferenceUUPS || isUUPS,
57
- };
58
- } else {
59
- const initializable = inferInitializable(contractValidation);
60
- return {
61
- upgradeable: initializable || isUUPS,
62
- uups: isUUPS,
63
- };
30
+ let referenceContract = overrideReferenceContract;
31
+ if (referenceContract === undefined && annotationAssessment.referenceName !== undefined) {
32
+ referenceContract = findContract(annotationAssessment.referenceName, contract, allContracts);
64
33
  }
65
- }
66
-
67
- function getReferenceContract(reference: string, origin: SourceContract, allContracts: SourceContract[]) {
68
- const referenceContracts = allContracts.filter(c => c.fullyQualifiedName === reference || c.name === reference);
69
34
 
70
- if (referenceContracts.length > 1) {
71
- throw new ValidateCommandError(
72
- `Found multiple contracts with name ${reference} referenced in ${origin.fullyQualifiedName}.`,
73
- () =>
74
- `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.`,
75
- );
76
- } else if (referenceContracts.length === 1) {
77
- return referenceContracts[0];
78
- } else {
79
- throw new ReferenceContractNotFound(reference, origin.fullyQualifiedName);
35
+ let isReferenceUUPS = false;
36
+ if (referenceContract !== undefined) {
37
+ isReferenceUUPS = inferUUPS(referenceContract.validationData, referenceContract.fullyQualifiedName);
80
38
  }
39
+
40
+ return {
41
+ upgradeable:
42
+ referenceContract !== undefined ||
43
+ annotationAssessment.upgradeable ||
44
+ inferInitializable(contractValidation) ||
45
+ isUUPS,
46
+ referenceContract: referenceContract,
47
+ uups: isReferenceUUPS || isUUPS,
48
+ };
81
49
  }
82
50
 
83
51
  function getAnnotationAssessment(contract: SourceContract): AnnotationAssessment {
@@ -1,16 +1,13 @@
1
1
  import test from 'ava';
2
2
 
3
3
  import { promises as fs } from 'fs';
4
- import rimrafAsync from 'rimraf';
5
- import util from 'util';
4
+ import { rimraf } from 'rimraf';
6
5
  import path from 'path';
7
6
  import os from 'os';
8
7
 
9
8
  import { artifacts } from 'hardhat';
10
9
  import { validateUpgradeSafety } from './validate-upgrade-safety';
11
- import { ReferenceContractNotFound } from './upgradeability-assessment';
12
-
13
- const rimraf = util.promisify(rimrafAsync);
10
+ import { ReferenceContractNotFound } from './find-contract';
14
11
 
15
12
  test.before(async () => {
16
13
  process.chdir(await fs.mkdtemp(path.join(os.tmpdir(), 'upgrades-core-test-')));
@@ -44,8 +44,8 @@ Generated by [AVA](https://avajs.dev).
44
44
  ␊
45
45
  ✘ contracts/test/cli/Validate.sol:UpgradesFromUUPS (upgrades from contracts/test/cli/Validate.sol:HasUpgradeTo)␊
46
46
  ␊
47
- contracts/test/cli/Validate.sol:72: Implementation is missing a public \`upgradeTo(address)\` function␊
48
- Inherit UUPSUpgradeable to include this function in your contract␊
47
+ contracts/test/cli/Validate.sol:72: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
48
+ Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
49
49
  @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
50
50
  https://zpl.in/upgrades/error-008␊
51
51
  ␊