gate-evm-tools 1.0.26 → 1.0.28

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 (338) hide show
  1. package/README.md +14 -0
  2. package/bin/workflow.cjs +19 -0
  3. package/dist/core/BytecodeChecker.d.ts.map +1 -1
  4. package/dist/core/BytecodeChecker.js +16 -1
  5. package/dist/core/BytecodeChecker.js.map +1 -1
  6. package/dist/core/legacyProxyArtifact.d.ts +6 -0
  7. package/dist/core/legacyProxyArtifact.d.ts.map +1 -0
  8. package/dist/core/legacyProxyArtifact.js +36 -0
  9. package/dist/core/legacyProxyArtifact.js.map +1 -0
  10. package/dist-runtime/config/hardhatAdapters.d.ts +7 -0
  11. package/dist-runtime/config/hardhatAdapters.js +61 -0
  12. package/dist-runtime/config/hardhatAdapters.js.map +1 -0
  13. package/dist-runtime/config/networks.d.ts +32 -0
  14. package/dist-runtime/config/networks.js +275 -0
  15. package/dist-runtime/config/networks.js.map +1 -0
  16. package/dist-runtime/config/openzeppelin.d.ts +28 -0
  17. package/dist-runtime/config/openzeppelin.js +144 -0
  18. package/dist-runtime/config/openzeppelin.js.map +1 -0
  19. package/dist-runtime/config/rpc.d.ts +7 -0
  20. package/dist-runtime/config/rpc.js +19 -0
  21. package/dist-runtime/config/rpc.js.map +1 -0
  22. package/dist-runtime/config/zksyncSolcPath.d.ts +1 -0
  23. package/dist-runtime/config/zksyncSolcPath.js +61 -0
  24. package/dist-runtime/config/zksyncSolcPath.js.map +1 -0
  25. package/dist-runtime/migrate.d.ts +13 -0
  26. package/dist-runtime/migrate.js +208 -0
  27. package/dist-runtime/migrate.js.map +1 -0
  28. package/dist-runtime/package.json +1 -0
  29. package/dist-runtime/projectHardhat.d.ts +4 -0
  30. package/dist-runtime/projectHardhat.js +16 -0
  31. package/dist-runtime/projectHardhat.js.map +1 -0
  32. package/dist-runtime/runtime-identity.json +4 -0
  33. package/dist-runtime/template-migration.json +293 -0
  34. package/dist-runtime/workflow/checkCode.d.ts +1 -0
  35. package/dist-runtime/workflow/checkCode.js +16 -0
  36. package/dist-runtime/workflow/checkCode.js.map +1 -0
  37. package/dist-runtime/workflow/checkCodeFinalize.d.ts +1 -0
  38. package/dist-runtime/workflow/checkCodeFinalize.js +11 -0
  39. package/dist-runtime/workflow/checkCodeFinalize.js.map +1 -0
  40. package/dist-runtime/workflow/checkCodePlan.d.ts +1 -0
  41. package/dist-runtime/workflow/checkCodePlan.js +11 -0
  42. package/dist-runtime/workflow/checkCodePlan.js.map +1 -0
  43. package/dist-runtime/workflow/cli.d.ts +1 -0
  44. package/dist-runtime/workflow/cli.js +302 -0
  45. package/dist-runtime/workflow/cli.js.map +1 -0
  46. package/dist-runtime/workflow/commitContractInfo.d.ts +1 -0
  47. package/dist-runtime/workflow/commitContractInfo.js +64 -0
  48. package/dist-runtime/workflow/commitContractInfo.js.map +1 -0
  49. package/dist-runtime/workflow/create2Hashes.d.ts +1 -0
  50. package/dist-runtime/workflow/create2Hashes.js +76 -0
  51. package/dist-runtime/workflow/create2Hashes.js.map +1 -0
  52. package/dist-runtime/workflow/forkSourceProxy.d.ts +1 -0
  53. package/dist-runtime/workflow/forkSourceProxy.js +151 -0
  54. package/dist-runtime/workflow/forkSourceProxy.js.map +1 -0
  55. package/dist-runtime/workflow/importState.d.ts +1 -0
  56. package/dist-runtime/workflow/importState.js +193 -0
  57. package/dist-runtime/workflow/importState.js.map +1 -0
  58. package/dist-runtime/workflow/lib/authority.d.ts +28 -0
  59. package/dist-runtime/workflow/lib/authority.js +122 -0
  60. package/dist-runtime/workflow/lib/authority.js.map +1 -0
  61. package/dist-runtime/workflow/lib/calldata.d.ts +2 -0
  62. package/dist-runtime/workflow/lib/calldata.js +8 -0
  63. package/dist-runtime/workflow/lib/calldata.js.map +1 -0
  64. package/dist-runtime/workflow/lib/calls.d.ts +23 -0
  65. package/dist-runtime/workflow/lib/calls.js +316 -0
  66. package/dist-runtime/workflow/lib/calls.js.map +1 -0
  67. package/dist-runtime/workflow/lib/checkCode/args.d.ts +2 -0
  68. package/dist-runtime/workflow/lib/checkCode/args.js +68 -0
  69. package/dist-runtime/workflow/lib/checkCode/args.js.map +1 -0
  70. package/dist-runtime/workflow/lib/checkCode/command.d.ts +5 -0
  71. package/dist-runtime/workflow/lib/checkCode/command.js +35 -0
  72. package/dist-runtime/workflow/lib/checkCode/command.js.map +1 -0
  73. package/dist-runtime/workflow/lib/checkCode/dependencies.d.ts +6 -0
  74. package/dist-runtime/workflow/lib/checkCode/dependencies.js +125 -0
  75. package/dist-runtime/workflow/lib/checkCode/dependencies.js.map +1 -0
  76. package/dist-runtime/workflow/lib/checkCode/finalize.d.ts +17 -0
  77. package/dist-runtime/workflow/lib/checkCode/finalize.js +174 -0
  78. package/dist-runtime/workflow/lib/checkCode/finalize.js.map +1 -0
  79. package/dist-runtime/workflow/lib/checkCode/index.d.ts +3 -0
  80. package/dist-runtime/workflow/lib/checkCode/index.js +20 -0
  81. package/dist-runtime/workflow/lib/checkCode/index.js.map +1 -0
  82. package/dist-runtime/workflow/lib/checkCode/plan.d.ts +22 -0
  83. package/dist-runtime/workflow/lib/checkCode/plan.js +145 -0
  84. package/dist-runtime/workflow/lib/checkCode/plan.js.map +1 -0
  85. package/dist-runtime/workflow/lib/checkCodeReport.d.ts +25 -0
  86. package/dist-runtime/workflow/lib/checkCodeReport.js +102 -0
  87. package/dist-runtime/workflow/lib/checkCodeReport.js.map +1 -0
  88. package/dist-runtime/workflow/lib/checkCodeRunner.d.ts +87 -0
  89. package/dist-runtime/workflow/lib/checkCodeRunner.js +964 -0
  90. package/dist-runtime/workflow/lib/checkCodeRunner.js.map +1 -0
  91. package/dist-runtime/workflow/lib/cliTool.d.ts +10 -0
  92. package/dist-runtime/workflow/lib/cliTool.js +25 -0
  93. package/dist-runtime/workflow/lib/cliTool.js.map +1 -0
  94. package/dist-runtime/workflow/lib/config.d.ts +33 -0
  95. package/dist-runtime/workflow/lib/config.js +100 -0
  96. package/dist-runtime/workflow/lib/config.js.map +1 -0
  97. package/dist-runtime/workflow/lib/contractInfoCandidates.d.ts +82 -0
  98. package/dist-runtime/workflow/lib/contractInfoCandidates.js +441 -0
  99. package/dist-runtime/workflow/lib/contractInfoCandidates.js.map +1 -0
  100. package/dist-runtime/workflow/lib/controlledMulticallAbi.d.ts +2 -0
  101. package/dist-runtime/workflow/lib/controlledMulticallAbi.js +10 -0
  102. package/dist-runtime/workflow/lib/controlledMulticallAbi.js.map +1 -0
  103. package/dist-runtime/workflow/lib/create2.d.ts +49 -0
  104. package/dist-runtime/workflow/lib/create2.js +194 -0
  105. package/dist-runtime/workflow/lib/create2.js.map +1 -0
  106. package/dist-runtime/workflow/lib/create2Hashes.d.ts +22 -0
  107. package/dist-runtime/workflow/lib/create2Hashes.js +57 -0
  108. package/dist-runtime/workflow/lib/create2Hashes.js.map +1 -0
  109. package/dist-runtime/workflow/lib/deploymentInfo.d.ts +40 -0
  110. package/dist-runtime/workflow/lib/deploymentInfo.js +240 -0
  111. package/dist-runtime/workflow/lib/deploymentInfo.js.map +1 -0
  112. package/dist-runtime/workflow/lib/deploymentRecords.d.ts +137 -0
  113. package/dist-runtime/workflow/lib/deploymentRecords.js +374 -0
  114. package/dist-runtime/workflow/lib/deploymentRecords.js.map +1 -0
  115. package/dist-runtime/workflow/lib/deployments.d.ts +21 -0
  116. package/dist-runtime/workflow/lib/deployments.js +240 -0
  117. package/dist-runtime/workflow/lib/deployments.js.map +1 -0
  118. package/dist-runtime/workflow/lib/erc1967.d.ts +5 -0
  119. package/dist-runtime/workflow/lib/erc1967.js +29 -0
  120. package/dist-runtime/workflow/lib/erc1967.js.map +1 -0
  121. package/dist-runtime/workflow/lib/errors.d.ts +6 -0
  122. package/dist-runtime/workflow/lib/errors.js +77 -0
  123. package/dist-runtime/workflow/lib/errors.js.map +1 -0
  124. package/dist-runtime/workflow/lib/executionId.d.ts +7 -0
  125. package/dist-runtime/workflow/lib/executionId.js +26 -0
  126. package/dist-runtime/workflow/lib/executionId.js.map +1 -0
  127. package/dist-runtime/workflow/lib/executionPlan.d.ts +85 -0
  128. package/dist-runtime/workflow/lib/executionPlan.js +450 -0
  129. package/dist-runtime/workflow/lib/executionPlan.js.map +1 -0
  130. package/dist-runtime/workflow/lib/executionProgress.d.ts +5 -0
  131. package/dist-runtime/workflow/lib/executionProgress.js +100 -0
  132. package/dist-runtime/workflow/lib/executionProgress.js.map +1 -0
  133. package/dist-runtime/workflow/lib/external.d.ts +62 -0
  134. package/dist-runtime/workflow/lib/external.js +282 -0
  135. package/dist-runtime/workflow/lib/external.js.map +1 -0
  136. package/dist-runtime/workflow/lib/externalExecutionScanner.d.ts +64 -0
  137. package/dist-runtime/workflow/lib/externalExecutionScanner.js +638 -0
  138. package/dist-runtime/workflow/lib/externalExecutionScanner.js.map +1 -0
  139. package/dist-runtime/workflow/lib/forkSnapshot.d.ts +34 -0
  140. package/dist-runtime/workflow/lib/forkSnapshot.js +167 -0
  141. package/dist-runtime/workflow/lib/forkSnapshot.js.map +1 -0
  142. package/dist-runtime/workflow/lib/gateTool.d.ts +16 -0
  143. package/dist-runtime/workflow/lib/gateTool.js +177 -0
  144. package/dist-runtime/workflow/lib/gateTool.js.map +1 -0
  145. package/dist-runtime/workflow/lib/gateToolSync.d.ts +22 -0
  146. package/dist-runtime/workflow/lib/gateToolSync.js +253 -0
  147. package/dist-runtime/workflow/lib/gateToolSync.js.map +1 -0
  148. package/dist-runtime/workflow/lib/lock.d.ts +52 -0
  149. package/dist-runtime/workflow/lib/lock.js +269 -0
  150. package/dist-runtime/workflow/lib/lock.js.map +1 -0
  151. package/dist-runtime/workflow/lib/migrationState.d.ts +103 -0
  152. package/dist-runtime/workflow/lib/migrationState.js +920 -0
  153. package/dist-runtime/workflow/lib/migrationState.js.map +1 -0
  154. package/dist-runtime/workflow/lib/operatorExecution.d.ts +28 -0
  155. package/dist-runtime/workflow/lib/operatorExecution.js +134 -0
  156. package/dist-runtime/workflow/lib/operatorExecution.js.map +1 -0
  157. package/dist-runtime/workflow/lib/parameters.d.ts +58 -0
  158. package/dist-runtime/workflow/lib/parameters.js +323 -0
  159. package/dist-runtime/workflow/lib/parameters.js.map +1 -0
  160. package/dist-runtime/workflow/lib/pendingDeploymentReuse.d.ts +29 -0
  161. package/dist-runtime/workflow/lib/pendingDeploymentReuse.js +277 -0
  162. package/dist-runtime/workflow/lib/pendingDeploymentReuse.js.map +1 -0
  163. package/dist-runtime/workflow/lib/proxy.d.ts +18 -0
  164. package/dist-runtime/workflow/lib/proxy.js +19 -0
  165. package/dist-runtime/workflow/lib/proxy.js.map +1 -0
  166. package/dist-runtime/workflow/lib/registryCommit.d.ts +33 -0
  167. package/dist-runtime/workflow/lib/registryCommit.js +319 -0
  168. package/dist-runtime/workflow/lib/registryCommit.js.map +1 -0
  169. package/dist-runtime/workflow/lib/release.d.ts +57 -0
  170. package/dist-runtime/workflow/lib/release.js +256 -0
  171. package/dist-runtime/workflow/lib/release.js.map +1 -0
  172. package/dist-runtime/workflow/lib/releaseFinalize.d.ts +14 -0
  173. package/dist-runtime/workflow/lib/releaseFinalize.js +571 -0
  174. package/dist-runtime/workflow/lib/releaseFinalize.js.map +1 -0
  175. package/dist-runtime/workflow/lib/releaseParameters.d.ts +43 -0
  176. package/dist-runtime/workflow/lib/releaseParameters.js +184 -0
  177. package/dist-runtime/workflow/lib/releaseParameters.js.map +1 -0
  178. package/dist-runtime/workflow/lib/reporter.d.ts +39 -0
  179. package/dist-runtime/workflow/lib/reporter.js +452 -0
  180. package/dist-runtime/workflow/lib/reporter.js.map +1 -0
  181. package/dist-runtime/workflow/lib/resultPaths.d.ts +17 -0
  182. package/dist-runtime/workflow/lib/resultPaths.js +29 -0
  183. package/dist-runtime/workflow/lib/resultPaths.js.map +1 -0
  184. package/dist-runtime/workflow/lib/runtimeVersion.d.ts +10 -0
  185. package/dist-runtime/workflow/lib/runtimeVersion.js +46 -0
  186. package/dist-runtime/workflow/lib/runtimeVersion.js.map +1 -0
  187. package/dist-runtime/workflow/lib/signer.d.ts +10 -0
  188. package/dist-runtime/workflow/lib/signer.js +105 -0
  189. package/dist-runtime/workflow/lib/signer.js.map +1 -0
  190. package/dist-runtime/workflow/lib/signerIdentity.d.ts +1 -0
  191. package/dist-runtime/workflow/lib/signerIdentity.js +23 -0
  192. package/dist-runtime/workflow/lib/signerIdentity.js.map +1 -0
  193. package/dist-runtime/workflow/lib/simulation.d.ts +35 -0
  194. package/dist-runtime/workflow/lib/simulation.js +282 -0
  195. package/dist-runtime/workflow/lib/simulation.js.map +1 -0
  196. package/dist-runtime/workflow/lib/simulationCallers.d.ts +44 -0
  197. package/dist-runtime/workflow/lib/simulationCallers.js +260 -0
  198. package/dist-runtime/workflow/lib/simulationCallers.js.map +1 -0
  199. package/dist-runtime/workflow/lib/sourceRpcPolicy.d.ts +1 -0
  200. package/dist-runtime/workflow/lib/sourceRpcPolicy.js +43 -0
  201. package/dist-runtime/workflow/lib/sourceRpcPolicy.js.map +1 -0
  202. package/dist-runtime/workflow/lib/state.d.ts +6 -0
  203. package/dist-runtime/workflow/lib/state.js +25 -0
  204. package/dist-runtime/workflow/lib/state.js.map +1 -0
  205. package/dist-runtime/workflow/lib/staticValidation.d.ts +22 -0
  206. package/dist-runtime/workflow/lib/staticValidation.js +124 -0
  207. package/dist-runtime/workflow/lib/staticValidation.js.map +1 -0
  208. package/dist-runtime/workflow/lib/zksyncForkCapability.d.ts +27 -0
  209. package/dist-runtime/workflow/lib/zksyncForkCapability.js +52 -0
  210. package/dist-runtime/workflow/lib/zksyncForkCapability.js.map +1 -0
  211. package/dist-runtime/workflow/lib/zksyncForkRunner.d.ts +57 -0
  212. package/dist-runtime/workflow/lib/zksyncForkRunner.js +344 -0
  213. package/dist-runtime/workflow/lib/zksyncForkRunner.js.map +1 -0
  214. package/dist-runtime/workflow/reconcileExternal.d.ts +1 -0
  215. package/dist-runtime/workflow/reconcileExternal.js +87 -0
  216. package/dist-runtime/workflow/reconcileExternal.js.map +1 -0
  217. package/dist-runtime/workflow/reconcileExternalRun.d.ts +1 -0
  218. package/dist-runtime/workflow/reconcileExternalRun.js +77 -0
  219. package/dist-runtime/workflow/reconcileExternalRun.js.map +1 -0
  220. package/dist-runtime/workflow/releaseFinalize.d.ts +1 -0
  221. package/dist-runtime/workflow/releaseFinalize.js +11 -0
  222. package/dist-runtime/workflow/releaseFinalize.js.map +1 -0
  223. package/dist-runtime/workflow/run.d.ts +40 -0
  224. package/dist-runtime/workflow/run.js +858 -0
  225. package/dist-runtime/workflow/run.js.map +1 -0
  226. package/dist-runtime/workflow/staticValidate.d.ts +1 -0
  227. package/dist-runtime/workflow/staticValidate.js +26 -0
  228. package/dist-runtime/workflow/staticValidate.js.map +1 -0
  229. package/dist-runtime/workflow/steps/call.d.ts +3 -0
  230. package/dist-runtime/workflow/steps/call.js +9 -0
  231. package/dist-runtime/workflow/steps/call.js.map +1 -0
  232. package/dist-runtime/workflow/steps/check.d.ts +3 -0
  233. package/dist-runtime/workflow/steps/check.js +9 -0
  234. package/dist-runtime/workflow/steps/check.js.map +1 -0
  235. package/dist-runtime/workflow/steps/custom.d.ts +3 -0
  236. package/dist-runtime/workflow/steps/custom.js +33 -0
  237. package/dist-runtime/workflow/steps/custom.js.map +1 -0
  238. package/dist-runtime/workflow/steps/deploy.d.ts +3 -0
  239. package/dist-runtime/workflow/steps/deploy.js +596 -0
  240. package/dist-runtime/workflow/steps/deploy.js.map +1 -0
  241. package/dist-runtime/workflow/steps/upgrade.d.ts +3 -0
  242. package/dist-runtime/workflow/steps/upgrade.js +466 -0
  243. package/dist-runtime/workflow/steps/upgrade.js.map +1 -0
  244. package/dist-runtime/workflow/steps/view.d.ts +3 -0
  245. package/dist-runtime/workflow/steps/view.js +9 -0
  246. package/dist-runtime/workflow/steps/view.js.map +1 -0
  247. package/docs/direct-package-acceptance.md +20 -0
  248. package/docs/external-infrastructure-acceptance.md +33 -0
  249. package/docs/network-runtime-acceptance.md +18 -0
  250. package/docs/plans/2026-09-09-workflow-extraction.md +16 -0
  251. package/docs/superpowers/plans/2026-07-22-manifest-bootstrap-transaction.md +50 -0
  252. package/docs/superpowers/plans/2026-07-22-manifest-review-remediation.md +49 -0
  253. package/docs/superpowers/plans/2026-08-17-custody-hardhat-signers.md +227 -0
  254. package/docs/superpowers/plans/2026-09-09-remove-template-infrastructure-contracts.md +11 -0
  255. package/docs/workflow-reference.md +1181 -0
  256. package/docs/workflow-runtime-acceptance.md +17 -0
  257. package/docs/workflow-runtime.md +56 -0
  258. package/package.json +26 -5
  259. package/runtime/config/hardhatAdapters.ts +58 -0
  260. package/runtime/config/networks.ts +305 -0
  261. package/runtime/config/openzeppelin.ts +173 -0
  262. package/runtime/config/rpc.ts +27 -0
  263. package/runtime/config/zksyncSolcPath.ts +59 -0
  264. package/runtime/hardhat-types.d.ts +2 -0
  265. package/runtime/migrate.ts +154 -0
  266. package/runtime/projectHardhat.ts +10 -0
  267. package/runtime/template-migration.json +293 -0
  268. package/runtime/workflow/checkCode.ts +13 -0
  269. package/runtime/workflow/checkCodeFinalize.ts +8 -0
  270. package/runtime/workflow/checkCodePlan.ts +8 -0
  271. package/runtime/workflow/cli.ts +356 -0
  272. package/runtime/workflow/commitContractInfo.ts +63 -0
  273. package/runtime/workflow/create2Hashes.ts +79 -0
  274. package/runtime/workflow/forkSourceProxy.ts +193 -0
  275. package/runtime/workflow/importState.ts +190 -0
  276. package/runtime/workflow/lib/authority.ts +170 -0
  277. package/runtime/workflow/lib/calldata.ts +9 -0
  278. package/runtime/workflow/lib/calls.ts +407 -0
  279. package/runtime/workflow/lib/checkCode/args.ts +76 -0
  280. package/runtime/workflow/lib/checkCode/command.ts +36 -0
  281. package/runtime/workflow/lib/checkCode/dependencies.ts +112 -0
  282. package/runtime/workflow/lib/checkCode/finalize.ts +198 -0
  283. package/runtime/workflow/lib/checkCode/index.ts +18 -0
  284. package/runtime/workflow/lib/checkCode/plan.ts +163 -0
  285. package/runtime/workflow/lib/checkCodeReport.ts +133 -0
  286. package/runtime/workflow/lib/checkCodeRunner.ts +1225 -0
  287. package/runtime/workflow/lib/cliTool.ts +31 -0
  288. package/runtime/workflow/lib/config.ts +130 -0
  289. package/runtime/workflow/lib/contractInfoCandidates.ts +690 -0
  290. package/runtime/workflow/lib/controlledMulticallAbi.ts +6 -0
  291. package/runtime/workflow/lib/create2.ts +278 -0
  292. package/runtime/workflow/lib/create2Hashes.ts +83 -0
  293. package/runtime/workflow/lib/deploymentInfo.ts +286 -0
  294. package/runtime/workflow/lib/deploymentRecords.ts +576 -0
  295. package/runtime/workflow/lib/deployments.ts +276 -0
  296. package/runtime/workflow/lib/erc1967.ts +57 -0
  297. package/runtime/workflow/lib/errors.ts +95 -0
  298. package/runtime/workflow/lib/executionId.ts +35 -0
  299. package/runtime/workflow/lib/executionPlan.ts +550 -0
  300. package/runtime/workflow/lib/executionProgress.ts +127 -0
  301. package/runtime/workflow/lib/external.ts +372 -0
  302. package/runtime/workflow/lib/externalExecutionScanner.ts +892 -0
  303. package/runtime/workflow/lib/forkSnapshot.ts +231 -0
  304. package/runtime/workflow/lib/gateTool.ts +261 -0
  305. package/runtime/workflow/lib/gateToolSync.ts +398 -0
  306. package/runtime/workflow/lib/lock.ts +388 -0
  307. package/runtime/workflow/lib/migrationState.ts +1246 -0
  308. package/runtime/workflow/lib/operatorExecution.ts +174 -0
  309. package/runtime/workflow/lib/parameters.ts +438 -0
  310. package/runtime/workflow/lib/pendingDeploymentReuse.ts +428 -0
  311. package/runtime/workflow/lib/proxy.ts +45 -0
  312. package/runtime/workflow/lib/registryCommit.ts +455 -0
  313. package/runtime/workflow/lib/release.ts +329 -0
  314. package/runtime/workflow/lib/releaseFinalize.ts +711 -0
  315. package/runtime/workflow/lib/releaseParameters.ts +248 -0
  316. package/runtime/workflow/lib/reporter.ts +502 -0
  317. package/runtime/workflow/lib/resultPaths.ts +49 -0
  318. package/runtime/workflow/lib/runtimeVersion.ts +28 -0
  319. package/runtime/workflow/lib/signer.ts +124 -0
  320. package/runtime/workflow/lib/signerIdentity.ts +22 -0
  321. package/runtime/workflow/lib/simulation.ts +415 -0
  322. package/runtime/workflow/lib/simulationCallers.ts +335 -0
  323. package/runtime/workflow/lib/sourceRpcPolicy.ts +41 -0
  324. package/runtime/workflow/lib/state.ts +25 -0
  325. package/runtime/workflow/lib/staticValidation.ts +142 -0
  326. package/runtime/workflow/lib/zksyncForkCapability.ts +80 -0
  327. package/runtime/workflow/lib/zksyncForkRunner.ts +505 -0
  328. package/runtime/workflow/reconcileExternal.ts +86 -0
  329. package/runtime/workflow/reconcileExternalRun.ts +88 -0
  330. package/runtime/workflow/releaseFinalize.ts +8 -0
  331. package/runtime/workflow/run.ts +1072 -0
  332. package/runtime/workflow/staticValidate.ts +23 -0
  333. package/runtime/workflow/steps/call.ts +10 -0
  334. package/runtime/workflow/steps/check.ts +10 -0
  335. package/runtime/workflow/steps/custom.ts +43 -0
  336. package/runtime/workflow/steps/deploy.ts +772 -0
  337. package/runtime/workflow/steps/upgrade.ts +599 -0
  338. package/runtime/workflow/steps/view.ts +10 -0
@@ -0,0 +1,276 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { isAddress } from "ethers";
4
+ import type { WorkflowConfig } from "./config";
5
+ import { readJsonFile, writeJsonFile } from "./config";
6
+
7
+ export type ContractInfo = Record<string, Record<string, string>>;
8
+
9
+ export interface ResolvedDeployment {
10
+ key: string;
11
+ address: string;
12
+ }
13
+
14
+ const contractInfoPath = (root: string): string => {
15
+ return path.join(root, "contractInfo.json");
16
+ };
17
+
18
+ const sleepSync = (milliseconds: number): void => {
19
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
20
+ };
21
+
22
+ const errorCode = (error: unknown): string | undefined => {
23
+ return error && typeof error === "object" && "code" in error
24
+ ? String((error as { code?: unknown }).code)
25
+ : undefined;
26
+ };
27
+
28
+ const lockOwnerIsAlive = (lockPath: string): boolean | undefined => {
29
+ let ownerPid: number;
30
+ try {
31
+ ownerPid = Number.parseInt(fs.readFileSync(lockPath, "utf8").split("-", 1)[0], 10);
32
+ } catch (error) {
33
+ if (errorCode(error) === "ENOENT") return false;
34
+ return undefined;
35
+ }
36
+ if (!Number.isSafeInteger(ownerPid) || ownerPid <= 0) return undefined;
37
+
38
+ try {
39
+ process.kill(ownerPid, 0);
40
+ return true;
41
+ } catch (error) {
42
+ if (errorCode(error) === "ESRCH") return false;
43
+ return true;
44
+ }
45
+ };
46
+
47
+ export const withContractInfoLock = <T>(root: string, operation: () => T): T => {
48
+ const filePath = contractInfoPath(root);
49
+ const lockPath = `${filePath}.lock`;
50
+ const token = `${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
51
+ const startedAt = Date.now();
52
+ const timeoutMs = 10_000;
53
+ const staleMs = 30_000;
54
+ let lockFile: number | undefined;
55
+
56
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
57
+ while (lockFile === undefined) {
58
+ try {
59
+ const candidate = fs.openSync(lockPath, "wx");
60
+ try {
61
+ fs.writeFileSync(candidate, `${token}\n`);
62
+ lockFile = candidate;
63
+ } catch (error) {
64
+ fs.closeSync(candidate);
65
+ fs.unlinkSync(lockPath);
66
+ throw error;
67
+ }
68
+ } catch (error) {
69
+ if (errorCode(error) !== "EEXIST") throw error;
70
+
71
+ try {
72
+ const ownerAlive = lockOwnerIsAlive(lockPath);
73
+ const lockAgeMs = Date.now() - fs.statSync(lockPath).mtimeMs;
74
+ if (
75
+ ownerAlive === false ||
76
+ (ownerAlive === undefined && lockAgeMs > staleMs)
77
+ ) {
78
+ fs.unlinkSync(lockPath);
79
+ continue;
80
+ }
81
+ } catch (statError) {
82
+ if (errorCode(statError) === "ENOENT") continue;
83
+ throw statError;
84
+ }
85
+
86
+ if (Date.now() - startedAt >= timeoutMs) {
87
+ throw new Error(`Timed out waiting for contractInfo lock: ${lockPath}`);
88
+ }
89
+ sleepSync(25);
90
+ }
91
+ }
92
+
93
+ let operationFailed = false;
94
+ try {
95
+ return operation();
96
+ } catch (error) {
97
+ operationFailed = true;
98
+ throw error;
99
+ } finally {
100
+ try {
101
+ fs.closeSync(lockFile);
102
+ if (fs.readFileSync(lockPath, "utf8").trim() === token) {
103
+ fs.unlinkSync(lockPath);
104
+ }
105
+ } catch (error) {
106
+ if (!operationFailed && errorCode(error) !== "ENOENT") throw error;
107
+ }
108
+ }
109
+ };
110
+
111
+ const isRecord = (value: unknown): value is Record<string, unknown> => {
112
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
113
+ };
114
+
115
+ export const validateContractInfo = (value: unknown): ContractInfo => {
116
+ if (!isRecord(value)) {
117
+ throw new Error("contractInfo.json must contain an object keyed by network");
118
+ }
119
+
120
+ const contractInfo: ContractInfo = {};
121
+ for (const [targetId, targetValue] of Object.entries(value)) {
122
+ if (!isRecord(targetValue)) {
123
+ throw new Error(`contractInfo.json network ${targetId} must contain an object`);
124
+ }
125
+
126
+ const entries: Record<string, string> = {};
127
+ const instanceIds = new Set<string>();
128
+ for (const [name, address] of Object.entries(targetValue)) {
129
+ const keyParts = name.split(":");
130
+ if (
131
+ keyParts.length > 2 ||
132
+ keyParts.some((part) => !part.trim() || part !== part.trim())
133
+ ) {
134
+ throw new Error(
135
+ `contractInfo.json key ${targetId}.${name} must use Contract or saveAs:Contract format`,
136
+ );
137
+ }
138
+ const instanceId = keyParts[0];
139
+ if (instanceIds.has(instanceId)) {
140
+ throw new Error(
141
+ `contractInfo.json network ${targetId} defines deployment instance ${instanceId} more than once`,
142
+ );
143
+ }
144
+ instanceIds.add(instanceId);
145
+
146
+ if (typeof address !== "string" || !isAddress(address)) {
147
+ throw new Error(
148
+ `contractInfo.json entry ${targetId}.${name} must be an address string with a valid EVM address`,
149
+ );
150
+ }
151
+ entries[name] = address;
152
+ }
153
+ contractInfo[targetId] = entries;
154
+ }
155
+ return contractInfo;
156
+ };
157
+
158
+ export const cloneContractInfo = (contractInfo: ContractInfo): ContractInfo => {
159
+ return Object.fromEntries(
160
+ Object.entries(contractInfo).map(([targetId, entries]) => [
161
+ targetId,
162
+ { ...entries },
163
+ ]),
164
+ );
165
+ };
166
+
167
+ export const actualContractName = (contractName: string): string => {
168
+ const trimmed = contractName.trim();
169
+ if (!trimmed) {
170
+ throw new Error("Actual contract name must not be empty");
171
+ }
172
+ const separator = trimmed.lastIndexOf(":");
173
+ const actual = separator >= 0 ? trimmed.slice(separator + 1).trim() : trimmed;
174
+ if (!actual) {
175
+ throw new Error(`Invalid fully qualified contract name: ${contractName}`);
176
+ }
177
+ return actual;
178
+ };
179
+
180
+ export const deploymentInstanceId = (instanceId: string): string => {
181
+ const normalizedInstanceId = instanceId.trim();
182
+ if (!normalizedInstanceId) {
183
+ throw new Error("Deployment saveAs must not be empty");
184
+ }
185
+ if (normalizedInstanceId.includes(":")) {
186
+ throw new Error(`Deployment saveAs "${normalizedInstanceId}" must not contain ":"`);
187
+ }
188
+ return normalizedInstanceId;
189
+ };
190
+
191
+ export const contractInfoKey = (instanceId: string, contractName: string): string => {
192
+ const normalizedInstanceId = deploymentInstanceId(instanceId);
193
+ const actual = actualContractName(contractName);
194
+ return normalizedInstanceId === actual
195
+ ? actual
196
+ : `${normalizedInstanceId}:${actual}`;
197
+ };
198
+
199
+ export const loadContractInfo = (root: string, _config: WorkflowConfig): ContractInfo => {
200
+ const filePath = contractInfoPath(root);
201
+ if (!fs.existsSync(filePath)) return {};
202
+ return validateContractInfo(readJsonFile<unknown>(filePath));
203
+ };
204
+
205
+ export const saveContractInfo = (root: string, contractInfo: ContractInfo): void => {
206
+ writeJsonFile(contractInfoPath(root), validateContractInfo(contractInfo));
207
+ };
208
+
209
+ export const planDeploymentAddress = (
210
+ contractInfo: ContractInfo,
211
+ targetId: string,
212
+ instanceId: string,
213
+ contractName: string,
214
+ address: string,
215
+ ): { key: string; contractInfo: ContractInfo } => {
216
+ const key = contractInfoKey(instanceId, contractName);
217
+ const normalizedInstanceId = deploymentInstanceId(instanceId);
218
+ const planned = cloneContractInfo(contractInfo);
219
+ const targetEntries = { ...(planned[targetId] || {}) };
220
+ for (const existingKey of Object.keys(targetEntries)) {
221
+ if (
222
+ existingKey === normalizedInstanceId ||
223
+ existingKey.startsWith(`${normalizedInstanceId}:`)
224
+ ) {
225
+ delete targetEntries[existingKey];
226
+ }
227
+ }
228
+ targetEntries[key] = address;
229
+ planned[targetId] = targetEntries;
230
+ return { key, contractInfo: planned };
231
+ };
232
+
233
+ export const resolveDeployment = (
234
+ contractInfo: ContractInfo,
235
+ targetId: string,
236
+ name: string,
237
+ ): ResolvedDeployment | undefined => {
238
+ const entries = contractInfo[targetId] || {};
239
+ const exactAddress = entries[name];
240
+ if (exactAddress) {
241
+ return { key: name, address: exactAddress };
242
+ }
243
+
244
+ const aliases = Object.entries(entries).filter(([key]) => key.startsWith(`${name}:`));
245
+ if (aliases.length > 1) {
246
+ throw new Error(
247
+ `Ambiguous contractInfo deployment ${targetId}.${name}; matches ${aliases.map(([key]) => key).join(", ")}`,
248
+ );
249
+ }
250
+ if (aliases.length === 1) {
251
+ return { key: aliases[0][0], address: aliases[0][1] };
252
+ }
253
+ return undefined;
254
+ };
255
+
256
+ export const findDeploymentAddress = (
257
+ root: string,
258
+ config: WorkflowConfig,
259
+ targetId: string,
260
+ name: string,
261
+ ): string | undefined => {
262
+ return resolveDeployment(loadContractInfo(root, config), targetId, name)?.address;
263
+ };
264
+
265
+ export const getDeploymentAddress = (
266
+ root: string,
267
+ config: WorkflowConfig,
268
+ targetId: string,
269
+ name: string,
270
+ ): string => {
271
+ const deployment = resolveDeployment(loadContractInfo(root, config), targetId, name);
272
+ if (!deployment) {
273
+ throw new Error(`Missing contractInfo address: ${targetId}.${name}`);
274
+ }
275
+ return deployment.address;
276
+ };
@@ -0,0 +1,57 @@
1
+ import type { Provider } from "ethers";
2
+ import { getAddress, isAddress } from "ethers";
3
+
4
+ export const ERC1967_IMPLEMENTATION_SLOT =
5
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
6
+
7
+ export const ERC1967_ADMIN_SLOT =
8
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
9
+
10
+ const getERC1967Address = async (
11
+ provider: Pick<Provider, "getStorage">,
12
+ proxyAddress: string,
13
+ slot: string,
14
+ label: string,
15
+ blockTag?: number,
16
+ ): Promise<string | undefined> => {
17
+ if (!isAddress(proxyAddress)) {
18
+ throw new Error("Invalid proxy candidate address: " + proxyAddress);
19
+ }
20
+ const storage = await provider.getStorage(proxyAddress, slot, blockTag);
21
+ if (!/^0x[0-9a-fA-F]{64}$/.test(storage)) {
22
+ throw new Error(`Invalid ERC1967 ${label} slot value for ${proxyAddress}`);
23
+ }
24
+ const storedAddress = "0x" + storage.slice(-40);
25
+ if (storedAddress.toLowerCase() === "0x" + "00".repeat(20)) {
26
+ return undefined;
27
+ }
28
+ return getAddress(storedAddress);
29
+ };
30
+
31
+ export const getERC1967Implementation = async (
32
+ provider: Pick<Provider, "getStorage">,
33
+ proxyAddress: string,
34
+ blockTag?: number,
35
+ ): Promise<string | undefined> => {
36
+ return getERC1967Address(
37
+ provider,
38
+ proxyAddress,
39
+ ERC1967_IMPLEMENTATION_SLOT,
40
+ "implementation",
41
+ blockTag,
42
+ );
43
+ };
44
+
45
+ export const getERC1967Admin = async (
46
+ provider: Pick<Provider, "getStorage">,
47
+ proxyAddress: string,
48
+ blockTag?: number,
49
+ ): Promise<string | undefined> => {
50
+ return getERC1967Address(
51
+ provider,
52
+ proxyAddress,
53
+ ERC1967_ADMIN_SLOT,
54
+ "admin",
55
+ blockTag,
56
+ );
57
+ };
@@ -0,0 +1,95 @@
1
+ export type WorkflowErrorType =
2
+ | "transient"
3
+ | "check_failed"
4
+ | "parameter_error"
5
+ | "config_error"
6
+ | "contract_error"
7
+ | "execution_reverted"
8
+ | "unknown";
9
+
10
+ export interface WorkflowErrorClassification {
11
+ errorType: WorkflowErrorType;
12
+ retryable: boolean;
13
+ }
14
+
15
+ const messageOf = (error: unknown): string => {
16
+ return error instanceof Error ? error.message : String(error);
17
+ };
18
+
19
+ const matchesAny = (message: string, patterns: RegExp[]): boolean => {
20
+ return patterns.some((pattern) => pattern.test(message));
21
+ };
22
+
23
+ export const classifyWorkflowError = (error: unknown): WorkflowErrorClassification => {
24
+ const message = messageOf(error);
25
+
26
+ if (matchesAny(message, [
27
+ /timeout/i,
28
+ /timed out/i,
29
+ /rate limit/i,
30
+ /too many requests/i,
31
+ /\b429\b/,
32
+ /\b503\b/,
33
+ /ECONNRESET/i,
34
+ /ETIMEDOUT/i,
35
+ /EAI_AGAIN/i,
36
+ /header not found/i,
37
+ /missing trie node/i,
38
+ /could not detect network/i,
39
+ /network error/i,
40
+ /connection/i,
41
+ ])) {
42
+ return { errorType: "transient", retryable: true };
43
+ }
44
+
45
+ if (matchesAny(message, [
46
+ /Check failed/i,
47
+ ])) {
48
+ return { errorType: "check_failed", retryable: false };
49
+ }
50
+
51
+ if (matchesAny(message, [
52
+ /Missing parameters/i,
53
+ /Reference not found/i,
54
+ /must resolve to an array/i,
55
+ /Invalid admin address/i,
56
+ /requires saveAs/i,
57
+ /Duplicate deploy saveAs/i,
58
+ ])) {
59
+ return { errorType: "parameter_error", retryable: false };
60
+ }
61
+
62
+ if (matchesAny(message, [
63
+ /Missing config\.yaml/i,
64
+ /Missing hardhat\.config\.ts network/i,
65
+ /cannot be forked/i,
66
+ /no factory address/i,
67
+ /no salt/i,
68
+ /simulation callers?/i,
69
+ /releaseTargetNetworks/i,
70
+ /release-target simulation/i,
71
+ ])) {
72
+ return { errorType: "config_error", retryable: false };
73
+ }
74
+
75
+ if (matchesAny(message, [
76
+ /Contract does not expose method/i,
77
+ /missing upgradeToAndCall/i,
78
+ /missing newImplementation/i,
79
+ /Unsupported step kind/i,
80
+ ])) {
81
+ return { errorType: "contract_error", retryable: false };
82
+ }
83
+
84
+ if (matchesAny(message, [
85
+ /revert/i,
86
+ /reverted/i,
87
+ /CALL_EXCEPTION/i,
88
+ /transaction failed/i,
89
+ /gate-tool validate failed/i,
90
+ ])) {
91
+ return { errorType: "execution_reverted", retryable: false };
92
+ }
93
+
94
+ return { errorType: "unknown", retryable: false };
95
+ };
@@ -0,0 +1,35 @@
1
+ const EXECUTION_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$/;
2
+ const MAX_EXECUTION_ID_LENGTH = 200;
3
+
4
+ interface BuildExecutionIdOptions {
5
+ now?: Date;
6
+ random?: number;
7
+ }
8
+
9
+ export const validateExecutionId = (
10
+ value: unknown,
11
+ label = "executionId",
12
+ ): string => {
13
+ if (typeof value !== "string" || !EXECUTION_ID_PATTERN.test(value)) {
14
+ throw new Error(
15
+ `${label} must match the canonical execution ID rule: `
16
+ + "1-200 letters, numbers, underscores, or hyphens, beginning with a letter or number",
17
+ );
18
+ }
19
+ return value;
20
+ };
21
+
22
+ export const buildExecutionId = (
23
+ targetId: string,
24
+ options: BuildExecutionIdOptions = {},
25
+ ): string => {
26
+ const timestamp = (options.now || new Date()).toISOString().replace(/\D/g, "");
27
+ const random = options.random ?? Math.random();
28
+ const nonce = random.toString(36).slice(2).padEnd(8, "0").slice(0, 8);
29
+ const prefix = `exec-${timestamp}-${nonce}`;
30
+ const targetBudget = MAX_EXECUTION_ID_LENGTH - prefix.length - 1;
31
+ const targetSlug = targetId
32
+ .replace(/[^A-Za-z0-9_-]/g, "-")
33
+ .slice(0, targetBudget);
34
+ return validateExecutionId(`${prefix}-${targetSlug}`);
35
+ };