@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 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;;;;AAAA,qDAA4C;AAC5C,gDAAwB;AAQxB,SAAgB,UAAU,CAAC,QAAgB,EAAE,cAAuB;IAClE,IAAI,QAAQ,KAAK,EAAE,EAAE;QACnB,OAAO;YACL,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC;YACpC,eAAe,EAAE,2BAA2B,CAAC,QAAQ,CAAC;YACtD,qBAAqB,EAAE,2BAA2B,CAAC,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,QAAQ,CAAC;SAC/E,CAAC;KACH;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;KACvD;AACH,CAAC;AAVD,gCAUC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,QAAQ,GAAG,QAAQ;SAChB,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,MAAM,WAAW,KAAK,CAAC;SACjF,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC,2BAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAErG,uEAAuE;IACvE,iEAAiE;IACjE,kFAAkF;IAClF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACzC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;KACvD;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5D,OAAO,2BAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAdD,oCAcC;AAED,SAAgB,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,YAAY,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAFD,kEAEC;AAED,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,yBAAyB;IACzB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;QACxB,OAAO,QAAQ,CAAC;KACjB;IAED,0DAA0D;IAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAEnD,yCAAyC;IACzC,IAAI,cAAc,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACxC,OAAO,QAAQ,CAAC;KACjB;IAED,0EAA0E;IAC1E,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,cAAc,GAAG,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEpE,iDAAiD;IACjD,IAAI;QACF,cAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;KAC3C;IAAC,OAAO,GAAG,EAAE;QACZ,uCAAuC;QACvC,OAAO,QAAQ,CAAC;KACjB;IAED,6BAA6B;IAC7B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.test.d.ts","sourceRoot":"","sources":["../src/version.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
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 version_1 = require("./version");
9
+ const contractBytecode = '01234567890abcdef';
10
+ ava_1.default('same code different formatting produces different metadata', async (t) => {
11
+ async function getBytecodeByContractName(contractName) {
12
+ const buildInfo = await hardhat_1.artifacts.getBuildInfo('contracts/test/Version.sol:Greeter');
13
+ if (buildInfo === undefined) {
14
+ throw new Error('Build info not found');
15
+ }
16
+ const solcOutput = buildInfo.output;
17
+ return solcOutput.contracts['contracts/test/Version.sol'][contractName].evm.bytecode.object;
18
+ }
19
+ const GreeterBytecode = await getBytecodeByContractName('Greeter');
20
+ const GreeterDifferentFormattingBytecode = await getBytecodeByContractName('GreeterDifferentFormatting');
21
+ t.not(version_1.hashBytecode(GreeterBytecode), version_1.hashBytecode(GreeterDifferentFormattingBytecode));
22
+ t.is(version_1.hashBytecodeWithoutMetadata(GreeterBytecode), version_1.hashBytecodeWithoutMetadata(GreeterDifferentFormattingBytecode));
23
+ });
24
+ ava_1.default('removes metadata from Solidity 0.4 bytecode', t => {
25
+ const swarmHash = '69b1869ae52f674ffccdd8f6d35de04d578a778e919a1b41b7a2177668e08e1a';
26
+ const swarmHashWrapper = `65627a7a72305820${swarmHash}`;
27
+ const metadata = `a1${swarmHashWrapper}0029`;
28
+ const bytecode = `0x${contractBytecode}${metadata}`;
29
+ t.is(version_1.hashBytecodeWithoutMetadata(bytecode), version_1.hashBytecode(`0x${contractBytecode}`));
30
+ });
31
+ ava_1.default('removes metadata from Solidity ^0.5.9 bytecode', t => {
32
+ // Solidity 0.5.9 includes solc version into the CBOR encoded metadata
33
+ // https://github.com/ethereum/solidity/releases/tag/v0.5.9
34
+ const swarmHash = '69b1869ae52f674ffccdd8f6d35de04d578a778e919a1b41b7a2177668e08e1a';
35
+ const swarmHashWrapper = `65627a7a72305820${swarmHash}`;
36
+ const solcVersionWrapper = '64736f6c6343000509';
37
+ const metadata = `a2${swarmHashWrapper}${solcVersionWrapper}0032`;
38
+ const bytecode = `0x${contractBytecode}${metadata}`;
39
+ t.is(version_1.hashBytecodeWithoutMetadata(bytecode), version_1.hashBytecode(`0x${contractBytecode}`));
40
+ });
41
+ ava_1.default('does not change the bytecode if metadata encoding is invalid', t => {
42
+ const swarmHash = '69b1869ae52f674ffccdd8f6d35de04d578a778e919a1b41b7a2177668e08e1a';
43
+ const invalidSwarmHashWrapper = `a165627a7a72305821${swarmHash}0029`;
44
+ const bytecode = `0x${contractBytecode}${invalidSwarmHashWrapper}`;
45
+ t.is(version_1.hashBytecodeWithoutMetadata(bytecode), version_1.hashBytecode(bytecode));
46
+ });
47
+ ava_1.default('does not change the bytecode if metadata length is not reliable', t => {
48
+ const swarmHash = '69b1869ae52f674ffccdd8f6d35de04d578a778e919a1b41b7a2177668e08e1a';
49
+ const invalidSwarmHashWrapper = `a165627a7a72305821${swarmHash}9929`;
50
+ const bytecode = `0x${contractBytecode}${invalidSwarmHashWrapper}`;
51
+ t.is(version_1.hashBytecodeWithoutMetadata(bytecode), version_1.hashBytecode(bytecode));
52
+ });
53
+ //# sourceMappingURL=version.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.test.js","sourceRoot":"","sources":["../src/version.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@openzeppelin/upgrades-core",
3
+ "version": "1.9.1",
4
+ "description": "",
5
+ "repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/core",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "files": [
9
+ "/dist",
10
+ "/src",
11
+ "/artifacts/AdminUpgradeabilityProxy.json",
12
+ "/artifacts/ProxyAdmin.json",
13
+ "/artifacts/contracts/proxy/AdminUpgradeabilityProxy.sol/AdminUpgradeabilityProxy.json",
14
+ "/artifacts/contracts/proxy/ProxyAdmin.sol/ProxyAdmin.json",
15
+ "/contracts/Initializable.sol",
16
+ "/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol",
17
+ "/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json ",
18
+ "/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json"
19
+ ],
20
+ "scripts": {
21
+ "prepublish": "rimraf artifacts cache dist *.tsbuildinfo",
22
+ "prepare": "tsc -b && yarn prepare:contracts",
23
+ "prepare:contracts": "hardhat compile",
24
+ "prepublishOnly": "bash scripts/copy-artifacts.sh",
25
+ "test": "tsc -b && hardhat compile --force && ava",
26
+ "test:watch": "hardhat compile --force && fgbg 'ava --watch' 'tsc -b --watch' --",
27
+ "version": "node ../../scripts/bump-changelog.js"
28
+ },
29
+ "devDependencies": {
30
+ "@ava/typescript": "^2.0.0",
31
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
32
+ "@nomiclabs/hardhat-etherscan": "^2.1.0",
33
+ "@openzeppelin/contracts": "4.1.0",
34
+ "@types/bn.js": "^5.0.0",
35
+ "@types/cbor": "^5.0.0",
36
+ "@types/debug": "^4.1.5",
37
+ "@types/mocha": "^7.0.2",
38
+ "@types/node": "^10.17.26",
39
+ "@types/proper-lockfile": "^4.1.1",
40
+ "@types/rimraf": "^3.0.0",
41
+ "ava": "^3.9.0",
42
+ "dotenv": "^10.0.0",
43
+ "fgbg": "^0.1.4",
44
+ "hardhat": "^2.0.2",
45
+ "rimraf": "^3.0.2",
46
+ "typescript": "^4.0.0"
47
+ },
48
+ "dependencies": {
49
+ "bn.js": "^5.1.2",
50
+ "cbor": "^8.0.0",
51
+ "chalk": "^4.1.0",
52
+ "compare-versions": "^3.6.0",
53
+ "debug": "^4.1.1",
54
+ "ethereumjs-util": "^7.0.3",
55
+ "proper-lockfile": "^4.1.1",
56
+ "solidity-ast": "^0.4.15"
57
+ }
58
+ }
@@ -0,0 +1,42 @@
1
+ import { findAll } from 'solidity-ast/utils';
2
+ import type { Node, NodeType, NodeTypeMap } from 'solidity-ast/node';
3
+
4
+ import { curry2 } from './utils/curry';
5
+ import type { SolcOutput } from './solc-api';
6
+
7
+ // An ASTDereferencer is a function that looks up an AST node given its id, in all of the source files involved in a
8
+ // solc run. It will generally be used together with the AST property `referencedDeclaration` (found in Identifier,
9
+ // UserDefinedTypeName, etc.) to look up a variable definition or type definition.
10
+
11
+ export interface ASTDereferencer {
12
+ <T extends NodeType>(nodeTypes: T[]): (id: number) => NodeTypeMap[T];
13
+ <T extends NodeType>(nodeTypes: T[], id: number): NodeTypeMap[T];
14
+ }
15
+
16
+ export function astDereferencer(solcOutput: SolcOutput): ASTDereferencer {
17
+ const asts = Array.from(Object.values(solcOutput.sources), s => s.ast);
18
+ const cache = new Map<number, Node>();
19
+
20
+ function deref<T extends NodeType>(nodeTypes: T[], id: number): NodeTypeMap[T] {
21
+ const cached = cache.get(id);
22
+
23
+ if (cached) {
24
+ if ((nodeTypes as NodeType[]).includes(cached.nodeType)) {
25
+ return cached as NodeTypeMap[T];
26
+ }
27
+ }
28
+
29
+ for (const ast of asts) {
30
+ for (const node of findAll(nodeTypes, ast)) {
31
+ if (node.id === id) {
32
+ cache.set(id, node);
33
+ return node;
34
+ }
35
+ }
36
+ }
37
+
38
+ throw new Error(`No node with id ${id} of type ${nodeTypes}`);
39
+ }
40
+
41
+ return curry2(deref);
42
+ }
@@ -0,0 +1,98 @@
1
+ import test from 'ava';
2
+ import { promisify } from 'util';
3
+
4
+ import { Deployment, resumeOrDeploy, waitAndValidateDeployment } from './deployment';
5
+ import { stubProvider } from './stub-provider';
6
+
7
+ const sleep = promisify(setTimeout);
8
+
9
+ test('deploys new contract', async t => {
10
+ const provider = stubProvider();
11
+ const deployment = await resumeOrDeploy(provider, undefined, provider.deploy);
12
+ t.true(provider.isContract(deployment.address));
13
+ t.is(provider.deployCount, 1);
14
+ });
15
+
16
+ test('resumes existing deployment with txHash', async t => {
17
+ const provider = stubProvider();
18
+ const first = await resumeOrDeploy(provider, undefined, provider.deployPending);
19
+ const second = await resumeOrDeploy(provider, first, provider.deployPending);
20
+ t.is(first, second);
21
+ t.is(provider.deployCount, 1);
22
+ });
23
+
24
+ test('resumes existing deployment without txHash', async t => {
25
+ const provider = stubProvider();
26
+ const first = await provider.deploy();
27
+ delete first.txHash;
28
+ const second = await resumeOrDeploy(provider, first, provider.deployPending);
29
+ t.is(first, second);
30
+ t.is(provider.deployCount, 1);
31
+ });
32
+
33
+ test('errors if tx is not found', async t => {
34
+ const provider = stubProvider();
35
+ const fakeDeployment: Deployment = {
36
+ address: '0x1aec6468218510f19bb19f52c4767996895ce711',
37
+ txHash: '0xc48e21ac9c051922f5ccf1b47b62000f567ef9bbc108d274848b44351a6872cb',
38
+ };
39
+ await t.throwsAsync(resumeOrDeploy(provider, fakeDeployment, provider.deploy));
40
+ });
41
+
42
+ test('redeploys if tx is not found on dev network', async t => {
43
+ // 31337 = Hardhat Network chainId
44
+ const provider = stubProvider(31337, 'HardhatNetwork/2.2.1/@ethereumjs/vm/5.3.2');
45
+ const fakeDeployment: Deployment = {
46
+ address: '0x1aec6468218510f19bb19f52c4767996895ce711',
47
+ txHash: '0xc48e21ac9c051922f5ccf1b47b62000f567ef9bbc108d274848b44351a6872cb',
48
+ };
49
+ const deployment = await resumeOrDeploy(provider, fakeDeployment, provider.deploy);
50
+ t.true(provider.isContract(deployment.address));
51
+ t.is(provider.deployCount, 1);
52
+ });
53
+
54
+ test('validates a mined deployment with txHash', async t => {
55
+ const provider = stubProvider();
56
+ const deployment = await resumeOrDeploy(provider, undefined, provider.deploy);
57
+ await waitAndValidateDeployment(provider, deployment);
58
+ t.is(provider.getMethodCount('eth_getTransactionReceipt'), 1);
59
+ t.is(provider.getMethodCount('eth_getCode'), 1);
60
+ });
61
+
62
+ test('validates a mined deployment without txHash', async t => {
63
+ const provider = stubProvider();
64
+ const deployment = await resumeOrDeploy(provider, undefined, provider.deploy);
65
+ delete deployment.txHash;
66
+ await waitAndValidateDeployment(provider, deployment);
67
+ t.is(provider.getMethodCount('eth_getTransactionReceipt'), 0);
68
+ t.is(provider.getMethodCount('eth_getCode'), 1);
69
+ });
70
+
71
+ test('waits for a deployment to mine', async t => {
72
+ const timeout = Symbol('timeout');
73
+ const provider = stubProvider();
74
+ const deployment = await resumeOrDeploy(provider, undefined, provider.deployPending);
75
+ const result = await Promise.race([waitAndValidateDeployment(provider, deployment), sleep(100).then(() => timeout)]);
76
+ t.is(result, timeout);
77
+ provider.mine();
78
+ await waitAndValidateDeployment(provider, deployment);
79
+ });
80
+
81
+ test('fails deployment fast if tx reverts', async t => {
82
+ const provider = stubProvider();
83
+ const deployment = await resumeOrDeploy(provider, undefined, provider.deploy);
84
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
85
+ provider.failTx(deployment.txHash!);
86
+ await t.throwsAsync(waitAndValidateDeployment(provider, deployment));
87
+ });
88
+
89
+ test('waits for a deployment to return contract code', async t => {
90
+ const timeout = Symbol('timeout');
91
+ const provider = stubProvider();
92
+ const deployment = await resumeOrDeploy(provider, undefined, provider.deploy);
93
+ provider.removeContract(deployment.address);
94
+ const result = await Promise.race([waitAndValidateDeployment(provider, deployment), sleep(100).then(() => timeout)]);
95
+ t.is(result, timeout);
96
+ provider.addContract(deployment.address);
97
+ await waitAndValidateDeployment(provider, deployment);
98
+ });
@@ -0,0 +1,122 @@
1
+ import { promisify } from 'util';
2
+
3
+ import debug from './utils/debug';
4
+ import { makeNonEnumerable } from './utils/make-non-enumerable';
5
+ import {
6
+ EthereumProvider,
7
+ getTransactionByHash,
8
+ getTransactionReceipt,
9
+ hasCode,
10
+ isDevelopmentNetwork,
11
+ isReceiptSuccessful,
12
+ } from './provider';
13
+
14
+ const sleep = promisify(setTimeout);
15
+
16
+ export interface Deployment {
17
+ address: string;
18
+ txHash?: string;
19
+ }
20
+
21
+ export async function resumeOrDeploy<T extends Deployment>(
22
+ provider: EthereumProvider,
23
+ cached: T | undefined,
24
+ deploy: () => Promise<T>,
25
+ ): Promise<T> {
26
+ if (cached !== undefined) {
27
+ const { txHash } = cached;
28
+ if (txHash === undefined) {
29
+ // Nothing to do here without a txHash.
30
+ // This is the case for deployments migrated from OpenZeppelin CLI.
31
+ return cached;
32
+ }
33
+ // If there is a deployment with txHash stored, we look its transaction up. If the
34
+ // transaction is found, the deployment is reused.
35
+ debug('found previous deployment', txHash);
36
+ const tx = await getTransactionByHash(provider, txHash);
37
+ if (tx !== null) {
38
+ debug('resuming previous deployment', txHash);
39
+ return cached;
40
+ } else if (!(await isDevelopmentNetwork(provider))) {
41
+ // If the transaction is not found we throw an error, except if we're in
42
+ // a development network then we simply silently redeploy.
43
+ throw new InvalidDeployment(cached);
44
+ } else {
45
+ debug('ignoring invalid deployment in development network', txHash);
46
+ }
47
+ }
48
+
49
+ const deployment = await deploy();
50
+ debug('initiated deployment', deployment.txHash);
51
+ return deployment;
52
+ }
53
+
54
+ export async function waitAndValidateDeployment(provider: EthereumProvider, deployment: Deployment): Promise<void> {
55
+ const { txHash, address } = deployment;
56
+
57
+ // Poll for 60 seconds with a 5 second poll interval.
58
+ // TODO: Make these parameters configurable.
59
+ const pollTimeout = 60e3;
60
+ const pollInterval = 5e3;
61
+
62
+ if (txHash !== undefined) {
63
+ const startTime = Date.now();
64
+
65
+ // eslint-disable-next-line no-constant-condition
66
+ while (true) {
67
+ const elapsedTime = Date.now() - startTime;
68
+ if (elapsedTime >= pollTimeout) {
69
+ // A timeout is NOT an InvalidDeployment
70
+ throw new TransactionMinedTimeout(deployment);
71
+ }
72
+ debug('verifying deployment tx mined', txHash);
73
+ const receipt = await getTransactionReceipt(provider, txHash);
74
+ if (receipt && isReceiptSuccessful(receipt)) {
75
+ debug('succeeded verifying deployment tx mined', txHash);
76
+ break;
77
+ } else if (receipt) {
78
+ debug('tx was reverted', txHash);
79
+ throw new InvalidDeployment(deployment);
80
+ } else {
81
+ debug('waiting for deployment tx mined', txHash);
82
+ await sleep(pollInterval);
83
+ }
84
+ }
85
+ }
86
+
87
+ debug('verifying code in target address', address);
88
+ const startTime = Date.now();
89
+ while (!(await hasCode(provider, address))) {
90
+ const elapsedTime = Date.now() - startTime;
91
+ if (elapsedTime >= pollTimeout || txHash === undefined) {
92
+ throw new InvalidDeployment(deployment);
93
+ }
94
+ await sleep(pollInterval);
95
+ }
96
+ debug('code in target address found', address);
97
+ }
98
+
99
+ export class TransactionMinedTimeout extends Error {
100
+ constructor(readonly deployment: Deployment) {
101
+ super(`Timed out waiting for transaction ${deployment.txHash}`);
102
+ }
103
+ }
104
+
105
+ export class InvalidDeployment extends Error {
106
+ removed = false;
107
+
108
+ constructor(readonly deployment: Deployment) {
109
+ super();
110
+ // This hides the properties from the error when it's printed.
111
+ makeNonEnumerable(this, 'removed');
112
+ makeNonEnumerable(this, 'deployment');
113
+ }
114
+
115
+ get message(): string {
116
+ let msg = `No contract at address ${this.deployment.address}`;
117
+ if (this.removed) {
118
+ msg += ' (Removed from manifest)';
119
+ }
120
+ return msg;
121
+ }
122
+ }
@@ -0,0 +1,77 @@
1
+ import { toChecksumAddress, keccak256 } from 'ethereumjs-util';
2
+ import BN from 'bn.js';
3
+
4
+ import { EthereumProvider, getStorageAt } from './provider';
5
+
6
+ export async function getAdminAddress(provider: EthereumProvider, address: string): Promise<string> {
7
+ const storage = await getStorageFallback(
8
+ provider,
9
+ address,
10
+ toEip1967Hash('eip1967.proxy.admin'),
11
+ toFallbackEip1967Hash('org.zeppelinos.proxy.admin'),
12
+ );
13
+
14
+ return parseAddress(storage);
15
+ }
16
+
17
+ export async function getImplementationAddress(provider: EthereumProvider, address: string): Promise<string> {
18
+ const storage = await getStorageFallback(
19
+ provider,
20
+ address,
21
+ toEip1967Hash('eip1967.proxy.implementation'),
22
+ toFallbackEip1967Hash('org.zeppelinos.proxy.implementation'),
23
+ );
24
+
25
+ if (isEmptySlot(storage)) {
26
+ throw new Error(`Contract at ${address} doesn't look like an administered ERC 1967 proxy`);
27
+ }
28
+
29
+ return parseAddress(storage);
30
+ }
31
+
32
+ export async function getBeaconAddress(provider: EthereumProvider, address: string): Promise<string> {
33
+ const storage = await getStorageFallback(provider, address, toEip1967Hash('eip1967.proxy.beacon'));
34
+
35
+ if (isEmptySlot(storage)) {
36
+ throw new Error(`Contract at ${address} doesn't look like an ERC 1967 beacon proxy`);
37
+ }
38
+
39
+ return parseAddress(storage);
40
+ }
41
+
42
+ async function getStorageFallback(provider: EthereumProvider, address: string, ...slots: string[]): Promise<string> {
43
+ let storage = '0x0000000000000000000000000000000000000000000000000000000000000000'; // default: empty slot
44
+
45
+ for (const slot of slots) {
46
+ storage = await getStorageAt(provider, address, slot);
47
+ if (!isEmptySlot(storage)) {
48
+ break;
49
+ }
50
+ }
51
+
52
+ return storage;
53
+ }
54
+
55
+ export function toFallbackEip1967Hash(label: string): string {
56
+ return '0x' + keccak256(Buffer.from(label)).toString('hex');
57
+ }
58
+
59
+ export function toEip1967Hash(label: string): string {
60
+ const hash = keccak256(Buffer.from(label));
61
+ const bigNumber = new BN(hash).sub(new BN(1));
62
+ return '0x' + bigNumber.toString(16);
63
+ }
64
+
65
+ function isEmptySlot(storage: string): boolean {
66
+ storage = storage.replace(/^0x/, '');
67
+ return new BN(storage, 'hex').isZero();
68
+ }
69
+
70
+ function parseAddress(storage: string): string {
71
+ const buf = Buffer.from(storage.replace(/^0x/, ''), 'hex');
72
+ if (!buf.slice(0, 12).equals(Buffer.alloc(12, 0))) {
73
+ throw new Error(`Value in storage is not an address (${storage})`);
74
+ }
75
+ const address = '0x' + buf.toString('hex', 12, 32); // grab the last 20 bytes
76
+ return toChecksumAddress(address);
77
+ }