@openzeppelin/upgrades-core 1.9.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 (336) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +4 -0
  3. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +80 -0
  4. package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +160 -0
  5. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +155 -0
  6. package/artifacts/AdminUpgradeabilityProxy.json +155 -0
  7. package/artifacts/ProxyAdmin.json +160 -0
  8. package/artifacts/contracts/proxy/AdminUpgradeabilityProxy.sol/AdminUpgradeabilityProxy.json +155 -0
  9. package/artifacts/contracts/proxy/ProxyAdmin.sol/ProxyAdmin.json +160 -0
  10. package/contracts/Initializable.sol +64 -0
  11. package/dist/ast-dereferencer.d.ts +8 -0
  12. package/dist/ast-dereferencer.d.ts.map +1 -0
  13. package/dist/ast-dereferencer.js +29 -0
  14. package/dist/ast-dereferencer.js.map +1 -0
  15. package/dist/deployment.d.ts +18 -0
  16. package/dist/deployment.d.ts.map +1 -0
  17. package/dist/deployment.js +110 -0
  18. package/dist/deployment.js.map +1 -0
  19. package/dist/deployment.test.d.ts +2 -0
  20. package/dist/deployment.test.d.ts.map +1 -0
  21. package/dist/deployment.test.js +92 -0
  22. package/dist/deployment.test.js.map +1 -0
  23. package/dist/eip-1967.d.ts +7 -0
  24. package/dist/eip-1967.d.ts.map +1 -0
  25. package/dist/eip-1967.js +63 -0
  26. package/dist/eip-1967.js.map +1 -0
  27. package/dist/error.d.ts +21 -0
  28. package/dist/error.d.ts.map +1 -0
  29. package/dist/error.js +21 -0
  30. package/dist/error.js.map +1 -0
  31. package/dist/impl-store.d.ts +7 -0
  32. package/dist/impl-store.d.ts.map +1 -0
  33. package/dist/impl-store.js +94 -0
  34. package/dist/impl-store.js.map +1 -0
  35. package/dist/impl-store.test.d.ts +2 -0
  36. package/dist/impl-store.test.d.ts.map +1 -0
  37. package/dist/impl-store.test.js +55 -0
  38. package/dist/impl-store.test.js.map +1 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +32 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/levenshtein.d.ts +12 -0
  44. package/dist/levenshtein.d.ts.map +1 -0
  45. package/dist/levenshtein.js +89 -0
  46. package/dist/levenshtein.js.map +1 -0
  47. package/dist/levenshtein.test.d.ts +2 -0
  48. package/dist/levenshtein.test.d.ts.map +1 -0
  49. package/dist/levenshtein.test.js +88 -0
  50. package/dist/levenshtein.test.js.map +1 -0
  51. package/dist/link-refs.d.ts +11 -0
  52. package/dist/link-refs.d.ts.map +1 -0
  53. package/dist/link-refs.js +36 -0
  54. package/dist/link-refs.js.map +1 -0
  55. package/dist/link-refs.test.d.ts +2 -0
  56. package/dist/link-refs.test.d.ts.map +1 -0
  57. package/dist/link-refs.test.js +76 -0
  58. package/dist/link-refs.test.js.map +1 -0
  59. package/dist/manifest-storage-layout.d.ts +6 -0
  60. package/dist/manifest-storage-layout.d.ts.map +1 -0
  61. package/dist/manifest-storage-layout.js +95 -0
  62. package/dist/manifest-storage-layout.js.map +1 -0
  63. package/dist/manifest-storage-layout.test.d.ts +2 -0
  64. package/dist/manifest-storage-layout.test.d.ts.map +1 -0
  65. package/dist/manifest-storage-layout.test.js +105 -0
  66. package/dist/manifest-storage-layout.test.js.map +1 -0
  67. package/dist/manifest.d.ts +36 -0
  68. package/dist/manifest.d.ts.map +1 -0
  69. package/dist/manifest.js +154 -0
  70. package/dist/manifest.js.map +1 -0
  71. package/dist/manifest.test.d.ts +2 -0
  72. package/dist/manifest.test.d.ts.map +1 -0
  73. package/dist/manifest.test.js +17 -0
  74. package/dist/manifest.test.js.map +1 -0
  75. package/dist/provider.d.ts +37 -0
  76. package/dist/provider.d.ts.map +1 -0
  77. package/dist/provider.js +74 -0
  78. package/dist/provider.js.map +1 -0
  79. package/dist/provider.test.d.ts +2 -0
  80. package/dist/provider.test.d.ts.map +1 -0
  81. package/dist/provider.test.js +41 -0
  82. package/dist/provider.test.js.map +1 -0
  83. package/dist/scripts/migrate-oz-cli-project.d.ts +108 -0
  84. package/dist/scripts/migrate-oz-cli-project.d.ts.map +1 -0
  85. package/dist/scripts/migrate-oz-cli-project.js +321 -0
  86. package/dist/scripts/migrate-oz-cli-project.js.map +1 -0
  87. package/dist/scripts/migrate-oz-cli-project.test.d.ts +2 -0
  88. package/dist/scripts/migrate-oz-cli-project.test.d.ts.map +1 -0
  89. package/dist/scripts/migrate-oz-cli-project.test.js +60 -0
  90. package/dist/scripts/migrate-oz-cli-project.test.js.map +1 -0
  91. package/dist/set-proxy-kind.d.ts +5 -0
  92. package/dist/set-proxy-kind.d.ts.map +1 -0
  93. package/dist/set-proxy-kind.js +25 -0
  94. package/dist/set-proxy-kind.js.map +1 -0
  95. package/dist/solc-api.d.ts +39 -0
  96. package/dist/solc-api.d.ts.map +1 -0
  97. package/dist/solc-api.js +3 -0
  98. package/dist/solc-api.js.map +1 -0
  99. package/dist/src-decoder.d.ts +6 -0
  100. package/dist/src-decoder.d.ts.map +1 -0
  101. package/dist/src-decoder.js +36 -0
  102. package/dist/src-decoder.js.map +1 -0
  103. package/dist/src-decoder.test.d.ts +2 -0
  104. package/dist/src-decoder.test.d.ts.map +1 -0
  105. package/dist/src-decoder.test.js +29 -0
  106. package/dist/src-decoder.test.js.map +1 -0
  107. package/dist/storage/compare.d.ts +55 -0
  108. package/dist/storage/compare.d.ts.map +1 -0
  109. package/dist/storage/compare.js +181 -0
  110. package/dist/storage/compare.js.map +1 -0
  111. package/dist/storage/compat.d.ts +4 -0
  112. package/dist/storage/compat.d.ts.map +1 -0
  113. package/dist/storage/compat.js +9 -0
  114. package/dist/storage/compat.js.map +1 -0
  115. package/dist/storage/extract.d.ts +7 -0
  116. package/dist/storage/extract.d.ts.map +1 -0
  117. package/dist/storage/extract.js +86 -0
  118. package/dist/storage/extract.js.map +1 -0
  119. package/dist/storage/index.d.ts +8 -0
  120. package/dist/storage/index.d.ts.map +1 -0
  121. package/dist/storage/index.js +65 -0
  122. package/dist/storage/index.js.map +1 -0
  123. package/dist/storage/layout.d.ts +31 -0
  124. package/dist/storage/layout.d.ts.map +1 -0
  125. package/dist/storage/layout.js +46 -0
  126. package/dist/storage/layout.js.map +1 -0
  127. package/dist/storage/report.d.ts +8 -0
  128. package/dist/storage/report.d.ts.map +1 -0
  129. package/dist/storage/report.js +175 -0
  130. package/dist/storage/report.js.map +1 -0
  131. package/dist/storage/report.test.d.ts +2 -0
  132. package/dist/storage/report.test.d.ts.map +1 -0
  133. package/dist/storage/report.test.js +82 -0
  134. package/dist/storage/report.test.js.map +1 -0
  135. package/dist/storage.test.d.ts +2 -0
  136. package/dist/storage.test.d.ts.map +1 -0
  137. package/dist/storage.test.js +436 -0
  138. package/dist/storage.test.js.map +1 -0
  139. package/dist/stub-provider.d.ts +14 -0
  140. package/dist/stub-provider.d.ts.map +1 -0
  141. package/dist/stub-provider.js +128 -0
  142. package/dist/stub-provider.js.map +1 -0
  143. package/dist/utils/assert.d.ts +3 -0
  144. package/dist/utils/assert.d.ts.map +1 -0
  145. package/dist/utils/assert.js +14 -0
  146. package/dist/utils/assert.js.map +1 -0
  147. package/dist/utils/curry.d.ts +6 -0
  148. package/dist/utils/curry.d.ts.map +1 -0
  149. package/dist/utils/curry.js +16 -0
  150. package/dist/utils/curry.js.map +1 -0
  151. package/dist/utils/debug.d.ts +4 -0
  152. package/dist/utils/debug.d.ts.map +1 -0
  153. package/dist/utils/debug.js +8 -0
  154. package/dist/utils/debug.js.map +1 -0
  155. package/dist/utils/deep-array.d.ts +3 -0
  156. package/dist/utils/deep-array.d.ts.map +1 -0
  157. package/dist/utils/deep-array.js +13 -0
  158. package/dist/utils/deep-array.js.map +1 -0
  159. package/dist/utils/deep-array.test.d.ts +2 -0
  160. package/dist/utils/deep-array.test.d.ts.map +1 -0
  161. package/dist/utils/deep-array.test.js +23 -0
  162. package/dist/utils/deep-array.test.js.map +1 -0
  163. package/dist/utils/function.d.ts +4 -0
  164. package/dist/utils/function.d.ts.map +1 -0
  165. package/dist/utils/function.js +43 -0
  166. package/dist/utils/function.js.map +1 -0
  167. package/dist/utils/function.test.d.ts +2 -0
  168. package/dist/utils/function.test.d.ts.map +1 -0
  169. package/dist/utils/function.test.js +34 -0
  170. package/dist/utils/function.test.js.map +1 -0
  171. package/dist/utils/indent.d.ts +2 -0
  172. package/dist/utils/indent.d.ts.map +1 -0
  173. package/dist/utils/indent.js +8 -0
  174. package/dist/utils/indent.js.map +1 -0
  175. package/dist/utils/is-nullish.d.ts +2 -0
  176. package/dist/utils/is-nullish.d.ts.map +1 -0
  177. package/dist/utils/is-nullish.js +8 -0
  178. package/dist/utils/is-nullish.js.map +1 -0
  179. package/dist/utils/is-nullish.test.d.ts +2 -0
  180. package/dist/utils/is-nullish.test.d.ts.map +1 -0
  181. package/dist/utils/is-nullish.test.js +17 -0
  182. package/dist/utils/is-nullish.test.js.map +1 -0
  183. package/dist/utils/is-value-type.d.ts +3 -0
  184. package/dist/utils/is-value-type.d.ts.map +1 -0
  185. package/dist/utils/is-value-type.js +8 -0
  186. package/dist/utils/is-value-type.js.map +1 -0
  187. package/dist/utils/itemize.d.ts +3 -0
  188. package/dist/utils/itemize.d.ts.map +1 -0
  189. package/dist/utils/itemize.js +18 -0
  190. package/dist/utils/itemize.js.map +1 -0
  191. package/dist/utils/log.d.ts +4 -0
  192. package/dist/utils/log.d.ts.map +1 -0
  193. package/dist/utils/log.js +35 -0
  194. package/dist/utils/log.js.map +1 -0
  195. package/dist/utils/make-non-enumerable.d.ts +2 -0
  196. package/dist/utils/make-non-enumerable.d.ts.map +1 -0
  197. package/dist/utils/make-non-enumerable.js +9 -0
  198. package/dist/utils/make-non-enumerable.js.map +1 -0
  199. package/dist/utils/map-values.d.ts +2 -0
  200. package/dist/utils/map-values.d.ts.map +1 -0
  201. package/dist/utils/map-values.js +12 -0
  202. package/dist/utils/map-values.js.map +1 -0
  203. package/dist/utils/parse-type-id.d.ts +9 -0
  204. package/dist/utils/parse-type-id.d.ts.map +1 -0
  205. package/dist/utils/parse-type-id.js +92 -0
  206. package/dist/utils/parse-type-id.js.map +1 -0
  207. package/dist/utils/parse-type-id.test.d.ts +2 -0
  208. package/dist/utils/parse-type-id.test.d.ts.map +1 -0
  209. package/dist/utils/parse-type-id.test.js +25 -0
  210. package/dist/utils/parse-type-id.test.js.map +1 -0
  211. package/dist/utils/pick.d.ts +2 -0
  212. package/dist/utils/pick.d.ts.map +1 -0
  213. package/dist/utils/pick.js +12 -0
  214. package/dist/utils/pick.js.map +1 -0
  215. package/dist/utils/type-id.d.ts +4 -0
  216. package/dist/utils/type-id.d.ts.map +1 -0
  217. package/dist/utils/type-id.js +65 -0
  218. package/dist/utils/type-id.js.map +1 -0
  219. package/dist/validate/compat.d.ts +6 -0
  220. package/dist/validate/compat.d.ts.map +1 -0
  221. package/dist/validate/compat.js +4 -0
  222. package/dist/validate/compat.js.map +1 -0
  223. package/dist/validate/data.d.ts +14 -0
  224. package/dist/validate/data.d.ts.map +1 -0
  225. package/dist/validate/data.js +50 -0
  226. package/dist/validate/data.js.map +1 -0
  227. package/dist/validate/error.d.ts +7 -0
  228. package/dist/validate/error.d.ts.map +1 -0
  229. package/dist/validate/error.js +78 -0
  230. package/dist/validate/error.js.map +1 -0
  231. package/dist/validate/index.d.ts +8 -0
  232. package/dist/validate/index.d.ts.map +1 -0
  233. package/dist/validate/index.js +24 -0
  234. package/dist/validate/index.js.map +1 -0
  235. package/dist/validate/overrides.d.ts +14 -0
  236. package/dist/validate/overrides.d.ts.map +1 -0
  237. package/dist/validate/overrides.js +72 -0
  238. package/dist/validate/overrides.js.map +1 -0
  239. package/dist/validate/query.d.ts +15 -0
  240. package/dist/validate/query.d.ts.map +1 -0
  241. package/dist/validate/query.js +111 -0
  242. package/dist/validate/query.js.map +1 -0
  243. package/dist/validate/query.test.d.ts +2 -0
  244. package/dist/validate/query.test.d.ts.map +1 -0
  245. package/dist/validate/query.test.js +48 -0
  246. package/dist/validate/query.test.js.map +1 -0
  247. package/dist/validate/run.d.ts +39 -0
  248. package/dist/validate/run.d.ts.map +1 -0
  249. package/dist/validate/run.js +199 -0
  250. package/dist/validate/run.js.map +1 -0
  251. package/dist/validate.test.d.ts +2 -0
  252. package/dist/validate.test.d.ts.map +1 -0
  253. package/dist/validate.test.js +116 -0
  254. package/dist/validate.test.js.map +1 -0
  255. package/dist/version.d.ts +9 -0
  256. package/dist/version.d.ts.map +1 -0
  257. package/dist/version.js +66 -0
  258. package/dist/version.js.map +1 -0
  259. package/dist/version.test.d.ts +2 -0
  260. package/dist/version.test.d.ts.map +1 -0
  261. package/dist/version.test.js +53 -0
  262. package/dist/version.test.js.map +1 -0
  263. package/package.json +58 -0
  264. package/src/ast-dereferencer.ts +42 -0
  265. package/src/deployment.test.ts +98 -0
  266. package/src/deployment.ts +122 -0
  267. package/src/eip-1967.ts +77 -0
  268. package/src/error.ts +26 -0
  269. package/src/impl-store.test.ts +59 -0
  270. package/src/impl-store.ts +124 -0
  271. package/src/index.ts +18 -0
  272. package/src/levenshtein.test.ts +91 -0
  273. package/src/levenshtein.ts +116 -0
  274. package/src/link-refs.test.ts +77 -0
  275. package/src/link-refs.ts +41 -0
  276. package/src/manifest-storage-layout.test.ts +118 -0
  277. package/src/manifest-storage-layout.ts +107 -0
  278. package/src/manifest.test.ts +13 -0
  279. package/src/manifest.ts +178 -0
  280. package/src/provider.test.ts +43 -0
  281. package/src/provider.ts +103 -0
  282. package/src/scripts/migratable-manifest.test.json +175 -0
  283. package/src/scripts/migrate-oz-cli-project.test.ts +70 -0
  284. package/src/scripts/migrate-oz-cli-project.test.ts.md +146 -0
  285. package/src/scripts/migrate-oz-cli-project.test.ts.snap +0 -0
  286. package/src/scripts/migrate-oz-cli-project.ts +484 -0
  287. package/src/scripts/project-file.test.json +25 -0
  288. package/src/set-proxy-kind.ts +27 -0
  289. package/src/solc-api.ts +42 -0
  290. package/src/src-decoder.test.ts +30 -0
  291. package/src/src-decoder.ts +37 -0
  292. package/src/storage/compare.ts +249 -0
  293. package/src/storage/compat.ts +3 -0
  294. package/src/storage/extract.ts +110 -0
  295. package/src/storage/index.ts +73 -0
  296. package/src/storage/layout.ts +88 -0
  297. package/src/storage/report.test.ts +95 -0
  298. package/src/storage/report.test.ts.md +154 -0
  299. package/src/storage/report.test.ts.snap +0 -0
  300. package/src/storage/report.ts +215 -0
  301. package/src/storage.test.ts +479 -0
  302. package/src/storage.test.ts.md +643 -0
  303. package/src/storage.test.ts.snap +0 -0
  304. package/src/stub-provider.ts +120 -0
  305. package/src/utils/assert.ts +9 -0
  306. package/src/utils/curry.ts +17 -0
  307. package/src/utils/debug.ts +3 -0
  308. package/src/utils/deep-array.test.ts +21 -0
  309. package/src/utils/deep-array.ts +9 -0
  310. package/src/utils/function.test.ts +37 -0
  311. package/src/utils/function.ts +53 -0
  312. package/src/utils/indent.ts +3 -0
  313. package/src/utils/is-nullish.test.ts +15 -0
  314. package/src/utils/is-nullish.ts +3 -0
  315. package/src/utils/is-value-type.ts +5 -0
  316. package/src/utils/itemize.ts +16 -0
  317. package/src/utils/log.ts +34 -0
  318. package/src/utils/make-non-enumerable.ts +4 -0
  319. package/src/utils/map-values.ts +7 -0
  320. package/src/utils/parse-type-id.test.ts +22 -0
  321. package/src/utils/parse-type-id.test.ts.md +264 -0
  322. package/src/utils/parse-type-id.test.ts.snap +0 -0
  323. package/src/utils/parse-type-id.ts +104 -0
  324. package/src/utils/pick.ts +7 -0
  325. package/src/utils/type-id.ts +57 -0
  326. package/src/validate/compat.ts +9 -0
  327. package/src/validate/data.ts +55 -0
  328. package/src/validate/error.ts +75 -0
  329. package/src/validate/index.ts +17 -0
  330. package/src/validate/overrides.ts +93 -0
  331. package/src/validate/query.test.ts +48 -0
  332. package/src/validate/query.ts +127 -0
  333. package/src/validate/run.ts +278 -0
  334. package/src/validate.test.ts +133 -0
  335. package/src/version.test.ts +59 -0
  336. package/src/version.ts +71 -0
@@ -0,0 +1,484 @@
1
+ import path from 'path';
2
+ import chalk from 'chalk';
3
+ import { promises as fs } from 'fs';
4
+ import { compare as compareVersions } from 'compare-versions';
5
+ import { ManifestData, ImplDeployment, ProxyDeployment } from '../manifest';
6
+ import type { StorageItem, StorageLayout, TypeItem, TypeItemMembers, StructMember } from '../storage/layout';
7
+
8
+ const OPEN_ZEPPELIN_FOLDER = '.openzeppelin';
9
+ const EXPORT_FILE = 'openzeppelin-cli-export.json';
10
+ const PROJECT_FILE = path.join(OPEN_ZEPPELIN_FOLDER, 'project.json');
11
+ const SUCCESS_CHECK = chalk.green('✔') + ' ';
12
+
13
+ export async function migrateLegacyProject(): Promise<void> {
14
+ const manifestFiles = await getManifestFiles();
15
+ const networksExportData = await migrateManifestFiles(manifestFiles);
16
+
17
+ const { compiler } = await getProjectFile();
18
+ const exportData = {
19
+ networks: networksExportData,
20
+ compiler,
21
+ };
22
+
23
+ await writeJSONFile(EXPORT_FILE, exportData);
24
+ console.log(SUCCESS_CHECK + `Migration data exported to ${EXPORT_FILE}`);
25
+ await deleteLegacyFiles(manifestFiles);
26
+
27
+ console.log("\nThese were your project's compiler options:");
28
+ console.log(JSON.stringify(compiler, null, 2));
29
+ }
30
+
31
+ export async function migrateManifestFiles(manifestFiles: string[]): Promise<Record<string, NetworkExportData>> {
32
+ const migratableManifestFiles = manifestFiles.filter(manifest => !isDevelopmentNetwork(getNetworkName(manifest)));
33
+ const migratableManifestsData: Record<string, NetworkFileData> = {};
34
+
35
+ for (const migratableFile of migratableManifestFiles) {
36
+ const network = getNetworkName(migratableFile);
37
+ migratableManifestsData[network] = JSON.parse(await fs.readFile(migratableFile, 'utf8'));
38
+ }
39
+
40
+ // we run the entire data migration before writing anything to disk
41
+ const { newManifestsData, networksExportData } = migrateManifestsData(migratableManifestsData);
42
+
43
+ for (const network in newManifestsData) {
44
+ const newManifestData = newManifestsData[network];
45
+ const newFilename = getNewManifestLocation(network);
46
+ await writeJSONFile(newFilename, newManifestData);
47
+ console.log(SUCCESS_CHECK + `Successfully migrated ${newFilename}`);
48
+ }
49
+
50
+ return networksExportData;
51
+ }
52
+
53
+ export async function deleteLegacyFiles(manifestFiles: string[]): Promise<void> {
54
+ const developmentManifests = manifestFiles.filter(manifestFile => isDevelopmentNetwork(getNetworkName(manifestFile)));
55
+
56
+ for (const manifestFile of developmentManifests) {
57
+ console.log(SUCCESS_CHECK + `Deleting unused development manifest ${manifestFile}`);
58
+ await fs.unlink(manifestFile);
59
+ }
60
+
61
+ console.log(SUCCESS_CHECK + `Deleting ${PROJECT_FILE}`);
62
+ await fs.unlink(PROJECT_FILE);
63
+ }
64
+
65
+ export function migrateManifestsData(manifestsData: Record<string, NetworkFileData>): MigrationOutput {
66
+ const networksExportData: Record<string, NetworkExportData> = {};
67
+ const newManifestsData: Record<string, ManifestData> = {};
68
+
69
+ for (const network of Object.keys(manifestsData)) {
70
+ const oldManifestData = manifestsData[network];
71
+ const { manifestVersion, zosversion } = oldManifestData;
72
+
73
+ const currentVersion = manifestVersion ?? zosversion;
74
+
75
+ if (currentVersion === undefined) {
76
+ throw new Error('Migration failed: manifest version too old. Update your OpenZeppelin CLI version.');
77
+ }
78
+
79
+ if (compareVersions(currentVersion, '3.0', '>=')) {
80
+ // no need to migrate
81
+ continue;
82
+ }
83
+
84
+ if (currentVersion !== '2.2') {
85
+ throw new Error(
86
+ `Migration failed: expected manifest version 2.2, got ${currentVersion} instead. Update your OpenZeppelin CLI version.`,
87
+ );
88
+ }
89
+
90
+ newManifestsData[network] = updateManifestData(oldManifestData);
91
+ networksExportData[network] = getExportData(oldManifestData);
92
+ }
93
+
94
+ return {
95
+ newManifestsData,
96
+ networksExportData,
97
+ };
98
+ }
99
+
100
+ async function getManifestFiles(): Promise<string[]> {
101
+ const files = await fs.readdir(OPEN_ZEPPELIN_FOLDER);
102
+ return files.filter(isManifestFile).map(location => path.join(OPEN_ZEPPELIN_FOLDER, location));
103
+ }
104
+
105
+ async function getProjectFile(): Promise<ProjectFileData> {
106
+ return JSON.parse(await fs.readFile(PROJECT_FILE, 'utf8'));
107
+ }
108
+
109
+ function isManifestFile(filename: string): boolean {
110
+ const network = getNetworkName(filename);
111
+ return isPublicNetwork(network) || isDevelopmentNetwork(network) || isUnknownNetwork(network);
112
+ }
113
+
114
+ function getNetworkName(filename: string): string {
115
+ return path.basename(filename, '.json');
116
+ }
117
+
118
+ function isDevelopmentNetwork(network: string): boolean {
119
+ // 13+ digits => ganache timestamp
120
+ // 31337 => hardhat network
121
+ return /^dev-(31337|\d{13,})$/.test(network);
122
+ }
123
+
124
+ function isUnknownNetwork(network: string): boolean {
125
+ return !isDevelopmentNetwork(network) && /^dev-\d+$/.test(network);
126
+ }
127
+
128
+ function isPublicNetwork(network: string): boolean {
129
+ return ['mainnet', 'rinkeby', 'ropsten', 'kovan', 'goerli'].includes(network);
130
+ }
131
+
132
+ function getNewManifestLocation(oldName: string): string {
133
+ const filename = isUnknownNetwork(oldName) ? oldName.replace('dev', 'unknown') : oldName;
134
+ return path.join(OPEN_ZEPPELIN_FOLDER, `${filename}.json`);
135
+ }
136
+
137
+ async function writeJSONFile(location: string, data: unknown): Promise<void> {
138
+ await fs.writeFile(location, JSON.stringify(data, null, 2));
139
+ }
140
+
141
+ function getExportData(oldManifestData: NetworkFileData): NetworkExportData {
142
+ const networksExportData: NetworkExportData & Partial<NetworkFileData> = Object.assign({}, oldManifestData);
143
+ delete networksExportData.proxyAdmin;
144
+ delete networksExportData.contracts;
145
+ delete networksExportData.solidityLibs;
146
+ delete networksExportData.manifestVersion;
147
+ delete networksExportData.zosversion;
148
+ delete networksExportData.version;
149
+ delete networksExportData.frozen;
150
+ return networksExportData;
151
+ }
152
+
153
+ function updateManifestData(oldManifestData: NetworkFileData): ManifestData {
154
+ const proxyAdmin = oldManifestData.proxyAdmin.address;
155
+
156
+ if (proxyAdmin === undefined) {
157
+ throw new Error('Legacy manifest does not have admin address');
158
+ }
159
+
160
+ if (Object.keys(oldManifestData.solidityLibs).length > 0) {
161
+ throw new Error('Legacy manifest links to external libraries which are not yet supported');
162
+ }
163
+
164
+ return {
165
+ manifestVersion: '3.2',
166
+ impls: transformImplementations(oldManifestData.contracts),
167
+ proxies: [...transformProxies(oldManifestData.proxies)],
168
+ admin: {
169
+ address: proxyAdmin,
170
+ },
171
+ };
172
+ }
173
+
174
+ function* transformProxies(proxies: LegacyProxies): Generator<ProxyDeployment> {
175
+ for (const contractName in proxies) {
176
+ for (const proxy of proxies[contractName]) {
177
+ switch (proxy.kind) {
178
+ case 'Upgradeable':
179
+ if (proxy.address) {
180
+ yield {
181
+ address: proxy.address,
182
+ kind: 'transparent',
183
+ };
184
+ }
185
+ break;
186
+
187
+ case 'Minimal':
188
+ case 'NonProxy':
189
+ // not supported by the new plugin
190
+ break;
191
+ }
192
+ }
193
+ }
194
+ }
195
+
196
+ function transformImplementations(contracts: LegacyContracts): Record<string, ImplDeployment> {
197
+ const impls: Record<string, ImplDeployment> = {};
198
+ for (const contractName in contracts) {
199
+ const contract = contracts[contractName];
200
+ if (contract.deployedBytecodeHash === undefined) {
201
+ continue;
202
+ } else {
203
+ impls[contract.deployedBytecodeHash] = transformImplementationItem(contract);
204
+ }
205
+ }
206
+ return impls;
207
+ }
208
+
209
+ function transformImplementationItem(contract: ContractInterface): ImplDeployment {
210
+ if (contract.address === undefined) {
211
+ throw new Error('Could not find implementation address');
212
+ }
213
+
214
+ return {
215
+ address: contract.address,
216
+ layout: transformLayout(contract),
217
+ };
218
+ }
219
+
220
+ function transformLayout(contract: ContractInterface): StorageLayout {
221
+ const { types, storage } = contract;
222
+ if (types === undefined || storage === undefined) {
223
+ throw new Error("Storage layout can't be undefined");
224
+ }
225
+
226
+ // We need to associate a made up astId to some types since the OpenZeppelin CLI used to drop them
227
+ const astIds = Object.keys(types);
228
+ const getAstId = (typeName: string): number => {
229
+ const astId = astIds.indexOf(typeName);
230
+ if (astId === -1) {
231
+ throw new Error(`Could not find type ${typeName}`);
232
+ }
233
+ return astId;
234
+ };
235
+
236
+ return {
237
+ storage: storage.map((storageItem: LegacyStorageItem) => transformStorageItem(storageItem, getAstId)),
238
+ types: transformTypes(types, getAstId),
239
+ };
240
+ }
241
+
242
+ function transformStorageItem(storageItem: LegacyStorageItem, getAstId: AstIdGetter): StorageItem {
243
+ return {
244
+ contract: storageItem.contract,
245
+ label: storageItem.label,
246
+ type: transformTypeName(storageItem.type, getAstId),
247
+ // TODO reconstruct path and line if sourcecode is available
248
+ src: storageItem.path,
249
+ };
250
+ }
251
+
252
+ function transformTypes(oldTypes: LegacyTypes, getAstId: AstIdGetter): Record<string, TypeItem> {
253
+ const newTypes: Record<string, TypeItem> = {};
254
+ for (const typeName in oldTypes) {
255
+ newTypes[transformTypeName(typeName, getAstId)] = transformType(
256
+ getTypeKind(typeName),
257
+ oldTypes[typeName],
258
+ getAstId,
259
+ );
260
+ }
261
+ return newTypes;
262
+ }
263
+
264
+ function transformType(typeKind: TypeKind, oldType: LegacyType, getAstId: AstIdGetter): TypeItem {
265
+ switch (typeKind) {
266
+ case 'Struct':
267
+ return {
268
+ label: stripContractName(oldType.label),
269
+ members: (oldType.members as StructMember[]).map(member => ({
270
+ label: stripContractName(member.label),
271
+ type: transformTypeName(member.type, getAstId),
272
+ })),
273
+ };
274
+ case 'Enum':
275
+ return {
276
+ label: stripContractName(oldType.label),
277
+ members: oldType.members,
278
+ };
279
+ default:
280
+ return {
281
+ label: stripContractName(oldType.label),
282
+ };
283
+ }
284
+ }
285
+
286
+ function transformTypeName(typeName: string, getAstId: AstIdGetter): string {
287
+ switch (getTypeKind(typeName)) {
288
+ case 'Struct':
289
+ return transformStructTypeName(typeName, getAstId);
290
+ case 'Enum':
291
+ return transformEnumTypeName(typeName, getAstId);
292
+ case 'Mapping':
293
+ return transformMappingTypeName(typeName, getAstId);
294
+ case 'DynArray':
295
+ return transformDynArrayTypeName(typeName, getAstId);
296
+ case 'StaticArray':
297
+ return transformStaticArrayTypeName(typeName, getAstId);
298
+ case 'Elementary':
299
+ return typeName;
300
+ default:
301
+ throw new Error(`Unknown type: ${typeName}`);
302
+ }
303
+ }
304
+
305
+ function transformStructTypeName(typeName: string, getAstId: AstIdGetter): string {
306
+ const name = stripContractName(getArgument(typeName));
307
+ const astId = getAstId(typeName);
308
+ return `t_struct(${name})${astId}_storage`;
309
+ }
310
+
311
+ function transformEnumTypeName(typeName: string, getAstId: AstIdGetter): string {
312
+ const name = stripContractName(getArgument(typeName));
313
+ const astId = getAstId(typeName);
314
+ return `t_enum(${name})${astId}`;
315
+ }
316
+
317
+ function transformMappingTypeName(typeName: string, getAstId: AstIdGetter): string {
318
+ const valueType = transformTypeName(getArgument(typeName), getAstId);
319
+ return `t_mapping(unknown,${valueType})`;
320
+ }
321
+
322
+ function transformDynArrayTypeName(typeName: string, getAstId: AstIdGetter): string {
323
+ const valueType = transformTypeName(getArgument(typeName), getAstId);
324
+ return `t_array(${valueType})dyn_storage`;
325
+ }
326
+
327
+ function transformStaticArrayTypeName(typeName: string, getAstId: AstIdGetter): string {
328
+ // here we assume the regex has been already validated
329
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
330
+ const size = typeName.match(/:(\d+)/)![1];
331
+ const valueType = transformTypeName(getArgument(typeName), getAstId);
332
+ return `t_array(${valueType})${size}_storage`;
333
+ }
334
+
335
+ function getArgument(typeName: string): string {
336
+ // here we assume the regex has been already validated
337
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
338
+ return typeName.match(/<(.+)>/)![1];
339
+ }
340
+
341
+ function stripContractName(s: string): string {
342
+ // regex always matches
343
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
344
+ return s.match(/(.+\.)?(.+)/)![2];
345
+ }
346
+
347
+ function getTypeKind(typeName: string): TypeKind {
348
+ if (/^t_struct<.+>/.test(typeName)) {
349
+ return 'Struct';
350
+ } else if (/^t_enum<.+>/.test(typeName)) {
351
+ return 'Enum';
352
+ } else if (/^t_mapping<.+>/.test(typeName)) {
353
+ return 'Mapping';
354
+ } else if (/^t_array:dyn<.+>/.test(typeName)) {
355
+ return 'DynArray';
356
+ } else if (/^t_array:\d+<.+>/.test(typeName)) {
357
+ return 'StaticArray';
358
+ } else {
359
+ return 'Elementary';
360
+ }
361
+ }
362
+
363
+ type TypeKind = 'Elementary' | 'Mapping' | 'Struct' | 'Enum' | 'DynArray' | 'StaticArray';
364
+ type LegacyContracts = Record<string, ContractInterface>;
365
+ type LegacyProxies = Record<string, ProxyInterface[]>;
366
+ type AstIdGetter = (typeName: string) => number;
367
+ type LegacyTypes = Record<string, LegacyType>;
368
+ type NetworkExportData = Pick<NetworkFileData, 'proxies' | 'proxyFactory' | 'app' | 'package' | 'provider'>;
369
+
370
+ export interface MigrationOutput {
371
+ newManifestsData: Record<string, ManifestData>;
372
+ networksExportData: Record<string, NetworkExportData>;
373
+ }
374
+
375
+ interface LegacyType {
376
+ id: string;
377
+ kind: string;
378
+ label: string;
379
+ members?: TypeItemMembers;
380
+ }
381
+
382
+ interface LegacyStorageItem extends StorageItem {
383
+ path: string;
384
+ astId: number;
385
+ }
386
+
387
+ // All of the following types are taken from OpenZeppelin CLI verbatim
388
+
389
+ interface ContractInterface {
390
+ address?: string;
391
+ constructorCode?: string;
392
+ localBytecodeHash?: string;
393
+ deployedBytecodeHash?: string;
394
+ bodyBytecodeHash?: string;
395
+ /* eslint-disable */
396
+ types?: any;
397
+ storage?: any;
398
+ warnings?: any;
399
+ [id: string]: any;
400
+ /* eslint-enable */
401
+ }
402
+
403
+ interface SolidityLibInterface {
404
+ address: string;
405
+ constructorCode: string;
406
+ bodyBytecodeHash: string;
407
+ localBytecodeHash: string;
408
+ deployedBytecodeHash: string;
409
+ }
410
+
411
+ enum ProxyType {
412
+ Upgradeable = 'Upgradeable',
413
+ Minimal = 'Minimal',
414
+ NonProxy = 'NonProxy',
415
+ }
416
+
417
+ interface ProxyInterface {
418
+ contractName?: string;
419
+ package?: string;
420
+ address?: string;
421
+ version?: string;
422
+ implementation?: string;
423
+ admin?: string;
424
+ kind?: ProxyType;
425
+ bytecodeHash?: string; // Only used for non-proxies from regulear deploys.
426
+ }
427
+
428
+ interface DependencyInterface {
429
+ name?: string;
430
+ package?: string;
431
+ version?: string;
432
+ customDeploy?: boolean;
433
+ }
434
+
435
+ interface AddressWrapper {
436
+ address?: string;
437
+ }
438
+
439
+ export interface NetworkFileData {
440
+ contracts: { [name: string]: ContractInterface };
441
+ solidityLibs: { [name: string]: SolidityLibInterface };
442
+ proxies: { [contractName: string]: ProxyInterface[] };
443
+ manifestVersion?: string;
444
+ zosversion?: string;
445
+ proxyAdmin: AddressWrapper;
446
+ proxyFactory: AddressWrapper;
447
+ app: AddressWrapper;
448
+ package: AddressWrapper;
449
+ provider: AddressWrapper;
450
+ version: string;
451
+ frozen: boolean;
452
+ dependencies: { [dependencyName: string]: DependencyInterface };
453
+ }
454
+
455
+ interface ConfigFileCompilerOptions {
456
+ manager: string;
457
+ solcVersion: string;
458
+ contractsDir: string;
459
+ artifactsDir: string;
460
+ compilerSettings: {
461
+ evmVersion: string;
462
+ optimizer: {
463
+ enabled: boolean;
464
+ runs?: string;
465
+ };
466
+ };
467
+ typechain: {
468
+ enabled: boolean;
469
+ outDir?: string;
470
+ target?: string;
471
+ };
472
+ }
473
+
474
+ export interface ProjectFileData {
475
+ name: string;
476
+ version: string;
477
+ manifestVersion?: string;
478
+ zosversion?: string;
479
+ dependencies: { [name: string]: string };
480
+ contracts: string[];
481
+ publish: boolean;
482
+ compiler: Partial<ConfigFileCompilerOptions>;
483
+ telemetryOptIn?: boolean;
484
+ }