gate-evm-tools 1.0.28 → 1.0.31

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 (618) hide show
  1. package/README.md +16 -1
  2. package/bin/cli.js +3 -0
  3. package/bin/delivery.cjs +51 -0
  4. package/bin/manifest-bootstrap.js +4 -15
  5. package/bin/workflow.cjs +1 -1
  6. package/dist/commands/plan/file-store.d.ts.map +1 -0
  7. package/dist/commands/plan/generate-deployment.d.ts +48 -0
  8. package/dist/commands/plan/generate-deployment.d.ts.map +1 -0
  9. package/dist/commands/plan/generate-deployment.js +211 -0
  10. package/dist/commands/plan/generate-deployment.js.map +1 -0
  11. package/dist/commands/plan/helpers.d.ts.map +1 -0
  12. package/dist/commands/plan/index.d.ts +3 -0
  13. package/dist/commands/plan/index.d.ts.map +1 -0
  14. package/dist/commands/plan/index.js +88 -0
  15. package/dist/commands/plan/index.js.map +1 -0
  16. package/dist/commands/sync.js +1 -1
  17. package/dist/commands/sync.js.map +1 -1
  18. package/dist/core/BytecodeChecker.d.ts.map +1 -1
  19. package/dist/core/BytecodeChecker.js +27 -8
  20. package/dist/core/BytecodeChecker.js.map +1 -1
  21. package/dist/core/preparation/artifacts.d.ts +2 -0
  22. package/dist/core/preparation/artifacts.d.ts.map +1 -1
  23. package/dist/core/preparation/artifacts.js +9 -3
  24. package/dist/core/preparation/artifacts.js.map +1 -1
  25. package/dist/core/preparation/evm.d.ts +38 -2
  26. package/dist/core/preparation/evm.d.ts.map +1 -1
  27. package/dist/core/preparation/evm.js +104 -32
  28. package/dist/core/preparation/evm.js.map +1 -1
  29. package/dist/core/preparation/evmManifestSync.d.ts +63 -0
  30. package/dist/core/preparation/evmManifestSync.d.ts.map +1 -0
  31. package/dist/core/preparation/evmManifestSync.js +146 -0
  32. package/dist/core/preparation/evmManifestSync.js.map +1 -0
  33. package/dist/core/preparation/index.d.ts +40 -2
  34. package/dist/core/preparation/index.d.ts.map +1 -1
  35. package/dist/core/preparation/index.js +3 -3
  36. package/dist/core/preparation/index.js.map +1 -1
  37. package/dist/core/preparation/manifest.d.ts +15 -3
  38. package/dist/core/preparation/manifest.d.ts.map +1 -1
  39. package/dist/core/preparation/manifest.js +21 -26
  40. package/dist/core/preparation/manifest.js.map +1 -1
  41. package/dist/core/preparation/normalize.d.ts.map +1 -1
  42. package/dist/core/preparation/normalize.js +14 -9
  43. package/dist/core/preparation/normalize.js.map +1 -1
  44. package/dist/core/preparation/types.d.ts +7 -2
  45. package/dist/core/preparation/types.d.ts.map +1 -1
  46. package/dist/custody/hardhat-runtime.d.ts.map +1 -1
  47. package/dist/custody/hardhat-runtime.js +2 -0
  48. package/dist/custody/hardhat-runtime.js.map +1 -1
  49. package/dist/custody/hardhat.d.ts +1 -0
  50. package/dist/custody/hardhat.d.ts.map +1 -1
  51. package/dist/custody/hardhat.js +1 -0
  52. package/dist/custody/hardhat.js.map +1 -1
  53. package/dist/custody/index.d.ts +1 -0
  54. package/dist/custody/index.d.ts.map +1 -1
  55. package/dist/custody/index.js +1 -0
  56. package/dist/custody/index.js.map +1 -1
  57. package/dist/custody/provider-wait.d.ts +13 -0
  58. package/dist/custody/provider-wait.d.ts.map +1 -0
  59. package/dist/custody/provider-wait.js +78 -0
  60. package/dist/custody/provider-wait.js.map +1 -0
  61. package/dist/delivery/policy.d.ts +6 -0
  62. package/dist/delivery/policy.d.ts.map +1 -0
  63. package/dist/delivery/policy.js +24 -0
  64. package/dist/delivery/policy.js.map +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +5 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/sync/index.d.ts +15 -0
  69. package/dist/sync/index.d.ts.map +1 -1
  70. package/dist/sync/index.js +8 -0
  71. package/dist/sync/index.js.map +1 -1
  72. package/dist/workflow/index.d.ts +6 -1
  73. package/dist/workflow/index.d.ts.map +1 -1
  74. package/dist/workflow/index.js +4 -0
  75. package/dist/workflow/index.js.map +1 -1
  76. package/dist-cjs/core/BytecodeChecker.js +526 -0
  77. package/dist-cjs/core/BytecodeChecker.js.map +1 -0
  78. package/dist-cjs/core/legacyProxyArtifact.js +42 -0
  79. package/dist-cjs/core/legacyProxyArtifact.js.map +1 -0
  80. package/dist-cjs/core/preparation/artifacts.js +11 -4
  81. package/dist-cjs/core/preparation/artifacts.js.map +1 -1
  82. package/dist-cjs/core/preparation/evm.js +105 -32
  83. package/dist-cjs/core/preparation/evm.js.map +1 -1
  84. package/dist-cjs/core/preparation/evmManifestSync.js +155 -0
  85. package/dist-cjs/core/preparation/evmManifestSync.js.map +1 -0
  86. package/dist-cjs/core/preparation/index.js +3 -3
  87. package/dist-cjs/core/preparation/index.js.map +1 -1
  88. package/dist-cjs/core/preparation/manifest.js +23 -28
  89. package/dist-cjs/core/preparation/manifest.js.map +1 -1
  90. package/dist-cjs/core/preparation/normalize.js +14 -9
  91. package/dist-cjs/core/preparation/normalize.js.map +1 -1
  92. package/dist-cjs/custody/hardhat-runtime.js +2 -0
  93. package/dist-cjs/custody/hardhat-runtime.js.map +1 -1
  94. package/dist-cjs/custody/hardhat.js +3 -1
  95. package/dist-cjs/custody/hardhat.js.map +1 -1
  96. package/dist-cjs/custody/index.js +3 -1
  97. package/dist-cjs/custody/index.js.map +1 -1
  98. package/dist-cjs/custody/provider-wait.js +81 -0
  99. package/dist-cjs/custody/provider-wait.js.map +1 -0
  100. package/dist-cjs/delivery/policy.js +29 -0
  101. package/dist-cjs/delivery/policy.js.map +1 -0
  102. package/dist-cjs/sync/index.js +8 -0
  103. package/dist-cjs/sync/index.js.map +1 -1
  104. package/dist-cjs/workflow/index.js +12 -1
  105. package/dist-cjs/workflow/index.js.map +1 -1
  106. package/dist-runtime/config/openzeppelin.d.ts +2 -1
  107. package/dist-runtime/config/openzeppelin.js +2 -19
  108. package/dist-runtime/config/openzeppelin.js.map +1 -1
  109. package/dist-runtime/delivery/abi.d.ts +14 -0
  110. package/dist-runtime/delivery/abi.js +161 -0
  111. package/dist-runtime/delivery/abi.js.map +1 -0
  112. package/dist-runtime/delivery/aggregate-bootstrap.d.ts +12 -0
  113. package/dist-runtime/delivery/aggregate-bootstrap.js +40 -0
  114. package/dist-runtime/delivery/aggregate-bootstrap.js.map +1 -0
  115. package/dist-runtime/delivery/aggregate-channel.d.ts +28 -0
  116. package/dist-runtime/delivery/aggregate-channel.js +155 -0
  117. package/dist-runtime/delivery/aggregate-channel.js.map +1 -0
  118. package/dist-runtime/delivery/aggregate-inputs.d.ts +168 -0
  119. package/dist-runtime/delivery/aggregate-inputs.js +57 -0
  120. package/dist-runtime/delivery/aggregate-inputs.js.map +1 -0
  121. package/dist-runtime/delivery/aggregate-source.d.ts +25 -0
  122. package/dist-runtime/delivery/aggregate-source.js +79 -0
  123. package/dist-runtime/delivery/aggregate-source.js.map +1 -0
  124. package/dist-runtime/delivery/aggregate-worker.d.ts +1 -0
  125. package/dist-runtime/delivery/aggregate-worker.js +191 -0
  126. package/dist-runtime/delivery/aggregate-worker.js.map +1 -0
  127. package/dist-runtime/delivery/aggregate.d.ts +51 -0
  128. package/dist-runtime/delivery/aggregate.js +190 -0
  129. package/dist-runtime/delivery/aggregate.js.map +1 -0
  130. package/dist-runtime/delivery/bindings.d.ts +21 -0
  131. package/dist-runtime/delivery/bindings.js +53 -0
  132. package/dist-runtime/delivery/bindings.js.map +1 -0
  133. package/dist-runtime/delivery/check-code.d.ts +19 -0
  134. package/dist-runtime/delivery/check-code.js +63 -0
  135. package/dist-runtime/delivery/check-code.js.map +1 -0
  136. package/dist-runtime/delivery/closure-format.d.ts +77 -0
  137. package/dist-runtime/delivery/closure-format.js +225 -0
  138. package/dist-runtime/delivery/closure-format.js.map +1 -0
  139. package/dist-runtime/delivery/codec-pin.d.ts +2 -0
  140. package/dist-runtime/delivery/codec-pin.js +7 -0
  141. package/dist-runtime/delivery/codec-pin.js.map +1 -0
  142. package/dist-runtime/delivery/codec.d.ts +19 -0
  143. package/dist-runtime/delivery/codec.js +73 -0
  144. package/dist-runtime/delivery/codec.js.map +1 -0
  145. package/dist-runtime/delivery/compiler-dependency-pins.d.ts +7 -0
  146. package/dist-runtime/delivery/compiler-dependency-pins.js +1689 -0
  147. package/dist-runtime/delivery/compiler-dependency-pins.js.map +1 -0
  148. package/dist-runtime/delivery/compiler-files.d.ts +40 -0
  149. package/dist-runtime/delivery/compiler-files.js +220 -0
  150. package/dist-runtime/delivery/compiler-files.js.map +1 -0
  151. package/dist-runtime/delivery/compiler-io.d.ts +2 -0
  152. package/dist-runtime/delivery/compiler-io.js +13 -0
  153. package/dist-runtime/delivery/compiler-io.js.map +1 -0
  154. package/dist-runtime/delivery/compiler-pins.d.ts +10 -0
  155. package/dist-runtime/delivery/compiler-pins.js +147 -0
  156. package/dist-runtime/delivery/compiler-pins.js.map +1 -0
  157. package/dist-runtime/delivery/compiler.d.ts +188 -0
  158. package/dist-runtime/delivery/compiler.js +850 -0
  159. package/dist-runtime/delivery/compiler.js.map +1 -0
  160. package/dist-runtime/delivery/config.d.ts +48 -0
  161. package/dist-runtime/delivery/config.js +99 -0
  162. package/dist-runtime/delivery/config.js.map +1 -0
  163. package/dist-runtime/delivery/configuration-definition.d.ts +22 -0
  164. package/dist-runtime/delivery/configuration-definition.js +316 -0
  165. package/dist-runtime/delivery/configuration-definition.js.map +1 -0
  166. package/dist-runtime/delivery/configuration-hre.d.ts +17 -0
  167. package/dist-runtime/delivery/configuration-hre.js +198 -0
  168. package/dist-runtime/delivery/configuration-hre.js.map +1 -0
  169. package/dist-runtime/delivery/configuration-runtime.d.ts +36 -0
  170. package/dist-runtime/delivery/configuration-runtime.js +248 -0
  171. package/dist-runtime/delivery/configuration-runtime.js.map +1 -0
  172. package/dist-runtime/delivery/configuration.d.ts +35 -0
  173. package/dist-runtime/delivery/configuration.js +83 -0
  174. package/dist-runtime/delivery/configuration.js.map +1 -0
  175. package/dist-runtime/delivery/create2.d.ts +3 -0
  176. package/dist-runtime/delivery/create2.js +48 -0
  177. package/dist-runtime/delivery/create2.js.map +1 -0
  178. package/dist-runtime/delivery/custom-closure.d.ts +27 -0
  179. package/dist-runtime/delivery/custom-closure.js +818 -0
  180. package/dist-runtime/delivery/custom-closure.js.map +1 -0
  181. package/dist-runtime/delivery/custom-format.d.ts +35 -0
  182. package/dist-runtime/delivery/custom-format.js +383 -0
  183. package/dist-runtime/delivery/custom-format.js.map +1 -0
  184. package/dist-runtime/delivery/custom.d.ts +32 -0
  185. package/dist-runtime/delivery/custom.js +158 -0
  186. package/dist-runtime/delivery/custom.js.map +1 -0
  187. package/dist-runtime/delivery/data.d.ts +7 -0
  188. package/dist-runtime/delivery/data.js +86 -0
  189. package/dist-runtime/delivery/data.js.map +1 -0
  190. package/dist-runtime/delivery/development.d.ts +91 -0
  191. package/dist-runtime/delivery/development.js +395 -0
  192. package/dist-runtime/delivery/development.js.map +1 -0
  193. package/dist-runtime/delivery/engine.d.ts +9 -0
  194. package/dist-runtime/delivery/engine.js +23 -0
  195. package/dist-runtime/delivery/engine.js.map +1 -0
  196. package/dist-runtime/delivery/eoa-observation.d.ts +43 -0
  197. package/dist-runtime/delivery/eoa-observation.js +145 -0
  198. package/dist-runtime/delivery/eoa-observation.js.map +1 -0
  199. package/dist-runtime/delivery/eoa-signed.d.ts +2 -0
  200. package/dist-runtime/delivery/eoa-signed.js +74 -0
  201. package/dist-runtime/delivery/eoa-signed.js.map +1 -0
  202. package/dist-runtime/delivery/eoa.d.ts +81 -0
  203. package/dist-runtime/delivery/eoa.js +274 -0
  204. package/dist-runtime/delivery/eoa.js.map +1 -0
  205. package/dist-runtime/delivery/execution-db.d.ts +20 -0
  206. package/dist-runtime/delivery/execution-db.js +153 -0
  207. package/dist-runtime/delivery/execution-db.js.map +1 -0
  208. package/dist-runtime/delivery/execution-files.d.ts +9 -0
  209. package/dist-runtime/delivery/execution-files.js +138 -0
  210. package/dist-runtime/delivery/execution-files.js.map +1 -0
  211. package/dist-runtime/delivery/execution-model.d.ts +56 -0
  212. package/dist-runtime/delivery/execution-model.js +66 -0
  213. package/dist-runtime/delivery/execution-model.js.map +1 -0
  214. package/dist-runtime/delivery/execution-store.d.ts +48 -0
  215. package/dist-runtime/delivery/execution-store.js +361 -0
  216. package/dist-runtime/delivery/execution-store.js.map +1 -0
  217. package/dist-runtime/delivery/existing-code.d.ts +37 -0
  218. package/dist-runtime/delivery/existing-code.js +75 -0
  219. package/dist-runtime/delivery/existing-code.js.map +1 -0
  220. package/dist-runtime/delivery/export.d.ts +51 -0
  221. package/dist-runtime/delivery/export.js +69 -0
  222. package/dist-runtime/delivery/export.js.map +1 -0
  223. package/dist-runtime/delivery/forkAudit.d.ts +119 -0
  224. package/dist-runtime/delivery/forkAudit.js +473 -0
  225. package/dist-runtime/delivery/forkAudit.js.map +1 -0
  226. package/dist-runtime/delivery/hardhat.d.ts +3 -0
  227. package/dist-runtime/delivery/hardhat.js +45 -0
  228. package/dist-runtime/delivery/hardhat.js.map +1 -0
  229. package/dist-runtime/delivery/history-registration.d.ts +2 -0
  230. package/dist-runtime/delivery/history-registration.js +17 -0
  231. package/dist-runtime/delivery/history-registration.js.map +1 -0
  232. package/dist-runtime/delivery/identities.d.ts +22 -0
  233. package/dist-runtime/delivery/identities.js +97 -0
  234. package/dist-runtime/delivery/identities.js.map +1 -0
  235. package/dist-runtime/delivery/input-files.d.ts +5 -0
  236. package/dist-runtime/delivery/input-files.js +70 -0
  237. package/dist-runtime/delivery/input-files.js.map +1 -0
  238. package/dist-runtime/delivery/inputs.d.ts +62 -0
  239. package/dist-runtime/delivery/inputs.js +187 -0
  240. package/dist-runtime/delivery/inputs.js.map +1 -0
  241. package/dist-runtime/delivery/journal.d.ts +35 -0
  242. package/dist-runtime/delivery/journal.js +270 -0
  243. package/dist-runtime/delivery/journal.js.map +1 -0
  244. package/dist-runtime/delivery/manifest.d.ts +14 -0
  245. package/dist-runtime/delivery/manifest.js +68 -0
  246. package/dist-runtime/delivery/manifest.js.map +1 -0
  247. package/dist-runtime/delivery/materialization.d.ts +20 -0
  248. package/dist-runtime/delivery/materialization.js +138 -0
  249. package/dist-runtime/delivery/materialization.js.map +1 -0
  250. package/dist-runtime/delivery/observations.d.ts +31 -0
  251. package/dist-runtime/delivery/observations.js +38 -0
  252. package/dist-runtime/delivery/observations.js.map +1 -0
  253. package/dist-runtime/delivery/parameters.d.ts +53 -0
  254. package/dist-runtime/delivery/parameters.js +257 -0
  255. package/dist-runtime/delivery/parameters.js.map +1 -0
  256. package/dist-runtime/delivery/pending.d.ts +70 -0
  257. package/dist-runtime/delivery/pending.js +99 -0
  258. package/dist-runtime/delivery/pending.js.map +1 -0
  259. package/dist-runtime/delivery/plan.d.ts +50 -0
  260. package/dist-runtime/delivery/plan.js +209 -0
  261. package/dist-runtime/delivery/plan.js.map +1 -0
  262. package/dist-runtime/delivery/planning.d.ts +81 -0
  263. package/dist-runtime/delivery/planning.js +302 -0
  264. package/dist-runtime/delivery/planning.js.map +1 -0
  265. package/dist-runtime/delivery/policy.d.ts +4 -0
  266. package/dist-runtime/delivery/policy.js +9 -0
  267. package/dist-runtime/delivery/policy.js.map +1 -0
  268. package/dist-runtime/delivery/preparation.d.ts +6 -0
  269. package/dist-runtime/delivery/preparation.js +158 -0
  270. package/dist-runtime/delivery/preparation.js.map +1 -0
  271. package/dist-runtime/delivery/production-environment.d.ts +2 -0
  272. package/dist-runtime/delivery/production-environment.js +12 -0
  273. package/dist-runtime/delivery/production-environment.js.map +1 -0
  274. package/dist-runtime/delivery/production-finalization.d.ts +86 -0
  275. package/dist-runtime/delivery/production-finalization.js +278 -0
  276. package/dist-runtime/delivery/production-finalization.js.map +1 -0
  277. package/dist-runtime/delivery/production.d.ts +461 -0
  278. package/dist-runtime/delivery/production.js +396 -0
  279. package/dist-runtime/delivery/production.js.map +1 -0
  280. package/dist-runtime/delivery/project-files.d.ts +8 -0
  281. package/dist-runtime/delivery/project-files.js +82 -0
  282. package/dist-runtime/delivery/project-files.js.map +1 -0
  283. package/dist-runtime/delivery/project.d.ts +15 -0
  284. package/dist-runtime/delivery/project.js +157 -0
  285. package/dist-runtime/delivery/project.js.map +1 -0
  286. package/dist-runtime/delivery/protocol.d.ts +49 -0
  287. package/dist-runtime/delivery/protocol.js +112 -0
  288. package/dist-runtime/delivery/protocol.js.map +1 -0
  289. package/dist-runtime/delivery/references.d.ts +19 -0
  290. package/dist-runtime/delivery/references.js +84 -0
  291. package/dist-runtime/delivery/references.js.map +1 -0
  292. package/dist-runtime/delivery/release-graph.d.ts +93 -0
  293. package/dist-runtime/delivery/release-graph.js +106 -0
  294. package/dist-runtime/delivery/release-graph.js.map +1 -0
  295. package/dist-runtime/delivery/release-history-capture.d.ts +7 -0
  296. package/dist-runtime/delivery/release-history-capture.js +76 -0
  297. package/dist-runtime/delivery/release-history-capture.js.map +1 -0
  298. package/dist-runtime/delivery/release-history.d.ts +43 -0
  299. package/dist-runtime/delivery/release-history.js +246 -0
  300. package/dist-runtime/delivery/release-history.js.map +1 -0
  301. package/dist-runtime/delivery/release.d.ts +172 -0
  302. package/dist-runtime/delivery/release.js +209 -0
  303. package/dist-runtime/delivery/release.js.map +1 -0
  304. package/dist-runtime/delivery/safe-manifest.d.ts +9 -0
  305. package/dist-runtime/delivery/safe-manifest.js +13 -0
  306. package/dist-runtime/delivery/safe-manifest.js.map +1 -0
  307. package/dist-runtime/delivery/safe-observation.d.ts +30 -0
  308. package/dist-runtime/delivery/safe-observation.js +487 -0
  309. package/dist-runtime/delivery/safe-observation.js.map +1 -0
  310. package/dist-runtime/delivery/safe-prepare.d.ts +13 -0
  311. package/dist-runtime/delivery/safe-prepare.js +81 -0
  312. package/dist-runtime/delivery/safe-prepare.js.map +1 -0
  313. package/dist-runtime/delivery/safe.d.ts +91 -0
  314. package/dist-runtime/delivery/safe.js +243 -0
  315. package/dist-runtime/delivery/safe.js.map +1 -0
  316. package/dist-runtime/delivery/same-fork-baseline.d.ts +8 -0
  317. package/dist-runtime/delivery/same-fork-baseline.js +20 -0
  318. package/dist-runtime/delivery/same-fork-baseline.js.map +1 -0
  319. package/dist-runtime/delivery/setup.d.ts +31 -0
  320. package/dist-runtime/delivery/setup.js +215 -0
  321. package/dist-runtime/delivery/setup.js.map +1 -0
  322. package/dist-runtime/delivery/source.d.ts +41 -0
  323. package/dist-runtime/delivery/source.js +137 -0
  324. package/dist-runtime/delivery/source.js.map +1 -0
  325. package/dist-runtime/delivery/target-fields.d.ts +2 -0
  326. package/dist-runtime/delivery/target-fields.js +11 -0
  327. package/dist-runtime/delivery/target-fields.js.map +1 -0
  328. package/dist-runtime/delivery/validation.d.ts +9 -0
  329. package/dist-runtime/delivery/validation.js +150 -0
  330. package/dist-runtime/delivery/validation.js.map +1 -0
  331. package/dist-runtime/delivery/verification.d.ts +16 -0
  332. package/dist-runtime/delivery/verification.js +65 -0
  333. package/dist-runtime/delivery/verification.js.map +1 -0
  334. package/dist-runtime/migrate.js +1 -0
  335. package/dist-runtime/migrate.js.map +1 -1
  336. package/dist-runtime/miner/binary.d.ts +2 -0
  337. package/dist-runtime/miner/binary.js +54 -0
  338. package/dist-runtime/miner/binary.js.map +1 -0
  339. package/dist-runtime/miner/cli.d.ts +1 -0
  340. package/dist-runtime/miner/cli.js +131 -0
  341. package/dist-runtime/miner/cli.js.map +1 -0
  342. package/dist-runtime/miner/index.d.ts +5 -0
  343. package/dist-runtime/miner/index.js +13 -0
  344. package/dist-runtime/miner/index.js.map +1 -0
  345. package/dist-runtime/miner/request.d.ts +7 -0
  346. package/dist-runtime/miner/request.js +73 -0
  347. package/dist-runtime/miner/request.js.map +1 -0
  348. package/dist-runtime/miner/runner.d.ts +2 -0
  349. package/dist-runtime/miner/runner.js +131 -0
  350. package/dist-runtime/miner/runner.js.map +1 -0
  351. package/dist-runtime/miner/types.d.ts +89 -0
  352. package/dist-runtime/miner/types.js +3 -0
  353. package/dist-runtime/miner/types.js.map +1 -0
  354. package/dist-runtime/miner/verify.d.ts +2 -0
  355. package/dist-runtime/miner/verify.js +75 -0
  356. package/dist-runtime/miner/verify.js.map +1 -0
  357. package/dist-runtime/runtime-identity.json +2 -2
  358. package/dist-runtime/vendor/plan-codec/index.cjs +820 -0
  359. package/dist-runtime/vendor/plan-codec/index.d.cts +32 -0
  360. package/dist-runtime/vendor/plan-codec/provenance.json +24 -0
  361. package/dist-runtime/workflow/engine.d.ts +14 -0
  362. package/dist-runtime/workflow/engine.js +160 -0
  363. package/dist-runtime/workflow/engine.js.map +1 -0
  364. package/dist-runtime/workflow/lib/authority.d.ts +6 -3
  365. package/dist-runtime/workflow/lib/authority.js.map +1 -1
  366. package/dist-runtime/workflow/lib/calls.d.ts +1 -1
  367. package/dist-runtime/workflow/lib/calls.js +43 -34
  368. package/dist-runtime/workflow/lib/calls.js.map +1 -1
  369. package/dist-runtime/workflow/lib/canonicalData.d.ts +8 -0
  370. package/dist-runtime/workflow/lib/canonicalData.js +68 -0
  371. package/dist-runtime/workflow/lib/canonicalData.js.map +1 -0
  372. package/dist-runtime/workflow/lib/config.d.ts +3 -1
  373. package/dist-runtime/workflow/lib/config.js.map +1 -1
  374. package/dist-runtime/workflow/lib/context.d.ts +76 -0
  375. package/dist-runtime/workflow/lib/context.js +3 -0
  376. package/dist-runtime/workflow/lib/context.js.map +1 -0
  377. package/dist-runtime/workflow/lib/create2.d.ts +1 -1
  378. package/dist-runtime/workflow/lib/create2.js +9 -12
  379. package/dist-runtime/workflow/lib/create2.js.map +1 -1
  380. package/dist-runtime/workflow/lib/deployments.d.ts +5 -5
  381. package/dist-runtime/workflow/lib/deployments.js +5 -13
  382. package/dist-runtime/workflow/lib/deployments.js.map +1 -1
  383. package/dist-runtime/workflow/lib/evidencePorts.d.ts +55 -0
  384. package/dist-runtime/workflow/lib/evidencePorts.js +3 -0
  385. package/dist-runtime/workflow/lib/evidencePorts.js.map +1 -0
  386. package/dist-runtime/workflow/lib/executionPlan.d.ts +4 -42
  387. package/dist-runtime/workflow/lib/executionPlan.js +15 -210
  388. package/dist-runtime/workflow/lib/executionPlan.js.map +1 -1
  389. package/dist-runtime/workflow/lib/gateTool.d.ts +6 -2
  390. package/dist-runtime/workflow/lib/gateTool.js +20 -10
  391. package/dist-runtime/workflow/lib/gateTool.js.map +1 -1
  392. package/dist-runtime/workflow/lib/gateToolSync.d.ts +1 -1
  393. package/dist-runtime/workflow/lib/gateToolSync.js +3 -2
  394. package/dist-runtime/workflow/lib/gateToolSync.js.map +1 -1
  395. package/dist-runtime/workflow/lib/operationNames.d.ts +3 -0
  396. package/dist-runtime/workflow/lib/operationNames.js +34 -0
  397. package/dist-runtime/workflow/lib/operationNames.js.map +1 -0
  398. package/dist-runtime/workflow/lib/parameters.d.ts +1 -1
  399. package/dist-runtime/workflow/lib/parameters.js +6 -22
  400. package/dist-runtime/workflow/lib/parameters.js.map +1 -1
  401. package/dist-runtime/workflow/lib/pendingDeploymentReuse.js +18 -52
  402. package/dist-runtime/workflow/lib/pendingDeploymentReuse.js.map +1 -1
  403. package/dist-runtime/workflow/lib/pendingUupsBinding.d.ts +42 -0
  404. package/dist-runtime/workflow/lib/pendingUupsBinding.js +39 -0
  405. package/dist-runtime/workflow/lib/pendingUupsBinding.js.map +1 -0
  406. package/dist-runtime/workflow/lib/plan.d.ts +55 -0
  407. package/dist-runtime/workflow/lib/plan.js +324 -0
  408. package/dist-runtime/workflow/lib/plan.js.map +1 -0
  409. package/dist-runtime/workflow/lib/planCli.d.ts +14 -0
  410. package/dist-runtime/workflow/lib/planCli.js +279 -0
  411. package/dist-runtime/workflow/lib/planCli.js.map +1 -0
  412. package/dist-runtime/workflow/lib/preparationEvidence.d.ts +4 -0
  413. package/dist-runtime/workflow/lib/preparationEvidence.js +19 -0
  414. package/dist-runtime/workflow/lib/preparationEvidence.js.map +1 -0
  415. package/dist-runtime/workflow/lib/proxy.d.ts +3 -2
  416. package/dist-runtime/workflow/lib/proxy.js +3 -4
  417. package/dist-runtime/workflow/lib/proxy.js.map +1 -1
  418. package/dist-runtime/workflow/lib/runtime.d.ts +6 -0
  419. package/dist-runtime/workflow/lib/runtime.js +48 -0
  420. package/dist-runtime/workflow/lib/runtime.js.map +1 -0
  421. package/dist-runtime/workflow/lib/signer.d.ts +3 -2
  422. package/dist-runtime/workflow/lib/signer.js +18 -18
  423. package/dist-runtime/workflow/lib/signer.js.map +1 -1
  424. package/dist-runtime/workflow/lib/simulation.d.ts +13 -6
  425. package/dist-runtime/workflow/lib/simulation.js +39 -31
  426. package/dist-runtime/workflow/lib/simulation.js.map +1 -1
  427. package/dist-runtime/workflow/lib/state.js +3 -3
  428. package/dist-runtime/workflow/lib/state.js.map +1 -1
  429. package/dist-runtime/workflow/lib/staticValidation.d.ts +28 -0
  430. package/dist-runtime/workflow/lib/staticValidation.js +54 -10
  431. package/dist-runtime/workflow/lib/staticValidation.js.map +1 -1
  432. package/dist-runtime/workflow/lib/transactionPlanner.d.ts +62 -0
  433. package/dist-runtime/workflow/lib/transactionPlanner.js +258 -0
  434. package/dist-runtime/workflow/lib/transactionPlanner.js.map +1 -0
  435. package/dist-runtime/workflow/lib/typedValue.d.ts +3 -0
  436. package/dist-runtime/workflow/lib/typedValue.js +76 -0
  437. package/dist-runtime/workflow/lib/typedValue.js.map +1 -0
  438. package/dist-runtime/workflow/lib/validation.d.ts +23 -0
  439. package/dist-runtime/workflow/lib/validation.js +15 -0
  440. package/dist-runtime/workflow/lib/validation.js.map +1 -0
  441. package/dist-runtime/workflow/planAdd.d.ts +1 -0
  442. package/dist-runtime/workflow/planAdd.js +11 -0
  443. package/dist-runtime/workflow/planAdd.js.map +1 -0
  444. package/dist-runtime/workflow/planRead.d.ts +1 -0
  445. package/dist-runtime/workflow/planRead.js +11 -0
  446. package/dist-runtime/workflow/planRead.js.map +1 -0
  447. package/dist-runtime/workflow/planStatus.d.ts +1 -0
  448. package/dist-runtime/workflow/planStatus.js +11 -0
  449. package/dist-runtime/workflow/planStatus.js.map +1 -0
  450. package/dist-runtime/workflow/planWrite.d.ts +1 -0
  451. package/dist-runtime/workflow/planWrite.js +11 -0
  452. package/dist-runtime/workflow/planWrite.js.map +1 -0
  453. package/dist-runtime/workflow/run.d.ts +1 -40
  454. package/dist-runtime/workflow/run.js +68 -136
  455. package/dist-runtime/workflow/run.js.map +1 -1
  456. package/dist-runtime/workflow/staticValidate.js +8 -3
  457. package/dist-runtime/workflow/staticValidate.js.map +1 -1
  458. package/dist-runtime/workflow/steps/call.d.ts +1 -1
  459. package/dist-runtime/workflow/steps/check.d.ts +1 -1
  460. package/dist-runtime/workflow/steps/custom.d.ts +1 -1
  461. package/dist-runtime/workflow/steps/deploy.d.ts +1 -1
  462. package/dist-runtime/workflow/steps/deploy.js +57 -55
  463. package/dist-runtime/workflow/steps/deploy.js.map +1 -1
  464. package/dist-runtime/workflow/steps/upgrade.d.ts +1 -1
  465. package/dist-runtime/workflow/steps/upgrade.js +62 -41
  466. package/dist-runtime/workflow/steps/upgrade.js.map +1 -1
  467. package/dist-runtime/workflow/steps/view.d.ts +1 -1
  468. package/docs/compiler-qualification.md +32 -0
  469. package/docs/configuration-runtime-observation.md +29 -0
  470. package/docs/create2-miner.md +100 -0
  471. package/docs/delivery-aggregate.md +27 -0
  472. package/docs/delivery-custom-input-closure.md +51 -0
  473. package/docs/delivery-development.md +32 -0
  474. package/docs/delivery-eoa.md +46 -0
  475. package/docs/delivery-evm-manifest.md +20 -0
  476. package/docs/delivery-execution-store.md +33 -0
  477. package/docs/delivery-inputs.md +46 -0
  478. package/docs/delivery-parameters.md +65 -0
  479. package/docs/delivery-planning.md +140 -0
  480. package/docs/delivery-release.md +65 -0
  481. package/docs/delivery-safe.md +72 -0
  482. package/docs/delivery-setup.md +146 -0
  483. package/docs/delivery-source.md +67 -0
  484. package/docs/superpowers/plans/2026-09-24-scheme-aware-static-validation.md +193 -0
  485. package/docs/superpowers/plans/2026-10-28-create2-miner.md +82 -0
  486. package/package.json +133 -9
  487. package/resources/create2/LICENSE +21 -0
  488. package/resources/create2/README.md +9 -0
  489. package/resources/create2/darwin-arm64/smartflow_miner +0 -0
  490. package/resources/create2/darwin-x64/smartflow_miner +0 -0
  491. package/resources/create2/manifest.json +27 -0
  492. package/runtime/config/openzeppelin.ts +3 -21
  493. package/runtime/delivery/abi.ts +225 -0
  494. package/runtime/delivery/aggregate-bootstrap.ts +29 -0
  495. package/runtime/delivery/aggregate-channel.ts +85 -0
  496. package/runtime/delivery/aggregate-inputs.ts +39 -0
  497. package/runtime/delivery/aggregate-source.ts +53 -0
  498. package/runtime/delivery/aggregate-worker.ts +133 -0
  499. package/runtime/delivery/aggregate.ts +139 -0
  500. package/runtime/delivery/bindings.ts +37 -0
  501. package/runtime/delivery/check-code.ts +38 -0
  502. package/runtime/delivery/closure-format.ts +350 -0
  503. package/runtime/delivery/codec-pin.ts +3 -0
  504. package/runtime/delivery/codec.ts +50 -0
  505. package/runtime/delivery/compiler-dependency-pins.ts +1685 -0
  506. package/runtime/delivery/compiler-files.ts +179 -0
  507. package/runtime/delivery/compiler-io.ts +10 -0
  508. package/runtime/delivery/compiler-pins.ts +143 -0
  509. package/runtime/delivery/compiler.ts +700 -0
  510. package/runtime/delivery/config.ts +93 -0
  511. package/runtime/delivery/configuration-definition.ts +133 -0
  512. package/runtime/delivery/configuration-hre.ts +130 -0
  513. package/runtime/delivery/configuration-runtime.ts +163 -0
  514. package/runtime/delivery/configuration.ts +64 -0
  515. package/runtime/delivery/create2.ts +57 -0
  516. package/runtime/delivery/custom-closure.ts +993 -0
  517. package/runtime/delivery/custom-format.ts +464 -0
  518. package/runtime/delivery/custom.ts +219 -0
  519. package/runtime/delivery/data.ts +94 -0
  520. package/runtime/delivery/development.ts +262 -0
  521. package/runtime/delivery/engine.ts +29 -0
  522. package/runtime/delivery/eoa-observation.ts +106 -0
  523. package/runtime/delivery/eoa-signed.ts +55 -0
  524. package/runtime/delivery/eoa.ts +288 -0
  525. package/runtime/delivery/execution-db.ts +131 -0
  526. package/runtime/delivery/execution-files.ts +135 -0
  527. package/runtime/delivery/execution-model.ts +102 -0
  528. package/runtime/delivery/execution-store.ts +411 -0
  529. package/runtime/delivery/existing-code.ts +44 -0
  530. package/runtime/delivery/export.ts +99 -0
  531. package/runtime/delivery/forkAudit.ts +620 -0
  532. package/runtime/delivery/hardhat.ts +38 -0
  533. package/runtime/delivery/history-registration.ts +10 -0
  534. package/runtime/delivery/identities.ts +132 -0
  535. package/runtime/delivery/input-files.ts +46 -0
  536. package/runtime/delivery/inputs.ts +197 -0
  537. package/runtime/delivery/journal.ts +201 -0
  538. package/runtime/delivery/manifest.ts +54 -0
  539. package/runtime/delivery/materialization.ts +53 -0
  540. package/runtime/delivery/observations.ts +60 -0
  541. package/runtime/delivery/parameters.ts +349 -0
  542. package/runtime/delivery/pending.ts +98 -0
  543. package/runtime/delivery/plan.ts +337 -0
  544. package/runtime/delivery/planning.ts +397 -0
  545. package/runtime/delivery/policy.ts +9 -0
  546. package/runtime/delivery/preparation.ts +224 -0
  547. package/runtime/delivery/production-environment.ts +6 -0
  548. package/runtime/delivery/production-finalization.ts +172 -0
  549. package/runtime/delivery/production.ts +375 -0
  550. package/runtime/delivery/project-files.ts +58 -0
  551. package/runtime/delivery/project.ts +117 -0
  552. package/runtime/delivery/protocol.ts +94 -0
  553. package/runtime/delivery/references.ts +106 -0
  554. package/runtime/delivery/release-graph.ts +49 -0
  555. package/runtime/delivery/release-history-capture.ts +32 -0
  556. package/runtime/delivery/release-history.ts +120 -0
  557. package/runtime/delivery/release.ts +128 -0
  558. package/runtime/delivery/safe-manifest.ts +11 -0
  559. package/runtime/delivery/safe-observation.ts +626 -0
  560. package/runtime/delivery/safe-prepare.ts +101 -0
  561. package/runtime/delivery/safe.ts +344 -0
  562. package/runtime/delivery/same-fork-baseline.ts +16 -0
  563. package/runtime/delivery/setup.ts +172 -0
  564. package/runtime/delivery/source.ts +130 -0
  565. package/runtime/delivery/target-fields.ts +7 -0
  566. package/runtime/delivery/validation.ts +247 -0
  567. package/runtime/delivery/verification.ts +47 -0
  568. package/runtime/migrate.ts +1 -0
  569. package/runtime/miner/binary.ts +41 -0
  570. package/runtime/miner/cli.ts +87 -0
  571. package/runtime/miner/index.ts +5 -0
  572. package/runtime/miner/request.ts +54 -0
  573. package/runtime/miner/runner.ts +90 -0
  574. package/runtime/miner/types.ts +71 -0
  575. package/runtime/miner/verify.ts +61 -0
  576. package/runtime/vendor/plan-codec/index.cjs +820 -0
  577. package/runtime/vendor/plan-codec/index.d.cts +32 -0
  578. package/runtime/vendor/plan-codec/provenance.json +24 -0
  579. package/runtime/workflow/engine.ts +174 -0
  580. package/runtime/workflow/lib/authority.ts +3 -3
  581. package/runtime/workflow/lib/calls.ts +46 -37
  582. package/runtime/workflow/lib/canonicalData.ts +45 -0
  583. package/runtime/workflow/lib/config.ts +1 -1
  584. package/runtime/workflow/lib/context.ts +76 -0
  585. package/runtime/workflow/lib/create2.ts +10 -12
  586. package/runtime/workflow/lib/deployments.ts +6 -14
  587. package/runtime/workflow/lib/evidencePorts.ts +20 -0
  588. package/runtime/workflow/lib/executionPlan.ts +17 -268
  589. package/runtime/workflow/lib/gateTool.ts +20 -8
  590. package/runtime/workflow/lib/gateToolSync.ts +3 -3
  591. package/runtime/workflow/lib/operationNames.ts +32 -0
  592. package/runtime/workflow/lib/parameters.ts +4 -21
  593. package/runtime/workflow/lib/pendingDeploymentReuse.ts +4 -56
  594. package/runtime/workflow/lib/pendingUupsBinding.ts +43 -0
  595. package/runtime/workflow/lib/plan.ts +334 -0
  596. package/runtime/workflow/lib/planCli.ts +279 -0
  597. package/runtime/workflow/lib/preparationEvidence.ts +14 -0
  598. package/runtime/workflow/lib/proxy.ts +5 -3
  599. package/runtime/workflow/lib/runtime.ts +46 -0
  600. package/runtime/workflow/lib/signer.ts +8 -5
  601. package/runtime/workflow/lib/simulation.ts +41 -17
  602. package/runtime/workflow/lib/state.ts +3 -3
  603. package/runtime/workflow/lib/staticValidation.ts +92 -11
  604. package/runtime/workflow/lib/transactionPlanner.ts +314 -0
  605. package/runtime/workflow/lib/typedValue.ts +46 -0
  606. package/runtime/workflow/lib/validation.ts +50 -0
  607. package/runtime/workflow/planAdd.ts +8 -0
  608. package/runtime/workflow/planRead.ts +8 -0
  609. package/runtime/workflow/planStatus.ts +8 -0
  610. package/runtime/workflow/planWrite.ts +8 -0
  611. package/runtime/workflow/run.ts +41 -174
  612. package/runtime/workflow/staticValidate.ts +8 -3
  613. package/runtime/workflow/steps/call.ts +1 -1
  614. package/runtime/workflow/steps/check.ts +1 -1
  615. package/runtime/workflow/steps/custom.ts +1 -1
  616. package/runtime/workflow/steps/deploy.ts +57 -58
  617. package/runtime/workflow/steps/upgrade.ts +69 -46
  618. package/runtime/workflow/steps/view.ts +1 -1
@@ -0,0 +1,94 @@
1
+ /** Delivery's own-data JSON boundary. Numbers are safe integers only; ABI integers may be decimal strings. */
2
+ export function strictData<T = unknown>(raw: T, label = "delivery data"): T {
3
+ return copyOwnData(raw, label);
4
+ }
5
+ /** Internal partial-value boundary: the only non-JSON value permitted is the caller's sentinel. */
6
+ export function copyOwnData<T>(raw: T, label: string, sentinel?: symbol): T {
7
+ const active = new Set<object>();
8
+ const visit = (value: unknown, path: string): unknown => {
9
+ if (sentinel !== undefined && value === sentinel) return value;
10
+ if (
11
+ value === null ||
12
+ typeof value === "string" ||
13
+ typeof value === "boolean"
14
+ )
15
+ return value;
16
+ if (typeof value === "number" && Number.isSafeInteger(value)) return value;
17
+ if (!value || typeof value !== "object")
18
+ throw new Error(
19
+ `${path} requires JSON own data (safe integer numbers only)`,
20
+ );
21
+ if (active.has(value)) throw new Error(`${path} contains a cycle`);
22
+ if (Object.getOwnPropertySymbols(value).length)
23
+ throw new Error(`${path} contains symbol fields`);
24
+ if (
25
+ !(
26
+ Array.isArray(value) ? [Array.prototype] : [Object.prototype, null]
27
+ ).includes(Object.getPrototypeOf(value))
28
+ )
29
+ throw new Error(`${path} requires plain own data`);
30
+ active.add(value);
31
+ const result: Record<string, unknown> | unknown[] = Array.isArray(value)
32
+ ? []
33
+ : {};
34
+ const keys = Object.getOwnPropertyNames(value);
35
+ if (
36
+ Array.isArray(value) &&
37
+ (keys.length !== value.length + 1 ||
38
+ keys.some(
39
+ (k) =>
40
+ k !== "length" &&
41
+ (!/^(0|[1-9][0-9]*)$/.test(k) || Number(k) >= value.length),
42
+ ))
43
+ )
44
+ throw new Error(`${path} contains sparse or extra array data`);
45
+ for (const key of keys.sort()) {
46
+ if (Array.isArray(value) && key === "length") continue;
47
+ const d = Object.getOwnPropertyDescriptor(value, key)!;
48
+ if (!d.enumerable || !("value" in d))
49
+ throw new Error(`${path}.${key} requires own enumerable data`);
50
+ Object.defineProperty(result, key, {
51
+ value: visit(d.value, `${path}.${key}`),
52
+ enumerable: true,
53
+ writable: true,
54
+ configurable: true,
55
+ });
56
+ }
57
+ active.delete(value);
58
+ return result;
59
+ };
60
+ return visit(raw, label) as T;
61
+ }
62
+ export function ownPath(
63
+ value: unknown,
64
+ parts: readonly string[],
65
+ label = "reference",
66
+ ): unknown {
67
+ let current = value;
68
+ for (const part of parts) {
69
+ if (!current || typeof current !== "object")
70
+ throw new Error(`${label} not found`);
71
+ if (
72
+ !(
73
+ Array.isArray(current) ? [Array.prototype] : [Object.prototype, null]
74
+ ).includes(Object.getPrototypeOf(current))
75
+ )
76
+ throw new Error(`${label} requires plain own data`);
77
+ const d = Object.getOwnPropertyDescriptor(current, part);
78
+ if (!d || !d.enumerable || !("value" in d) || d.value === undefined)
79
+ throw new Error(`${label} requires existing own data`);
80
+ current = d.value;
81
+ }
82
+ return current;
83
+ }
84
+ export const pointerPart = (key: string): string =>
85
+ key.replace(/~/g, "~0").replace(/\//g, "~1");
86
+ export function pointerParts(path: string): string[] {
87
+ if (path === "") return [];
88
+ if (!path.startsWith("/") || /~(?![01])/.test(path))
89
+ throw new Error("Invalid JSON pointer");
90
+ return path
91
+ .slice(1)
92
+ .split("/")
93
+ .map((p) => p.replace(/~1/g, "/").replace(/~0/g, "~"));
94
+ }
@@ -0,0 +1,262 @@
1
+ /** Tool-side development lifecycle. Production host authorization and Safe execution are separate milestones. */
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import {createRequire} from 'node:module';
5
+ import ts from 'typescript';
6
+ import {existingCodeCoverage,requiredExistingAddresses} from './existing-code';
7
+ import {yieldCompilerIo} from './compiler-io';
8
+ import {openDeliveryConfiguration} from './configuration';
9
+ import {getCreate2Address} from 'ethers';
10
+ import {artifactIdentity,BytecodeChecker,prepareEvmManifestCandidate,mergeEvmManifestCandidate,parseTargetManifest,hashStorageLayout,resolveTargetManifestPaths} from 'gate-evm-tools/workflow';
11
+ import {canonicalData,canonicalJson,deepFreeze,semanticHash} from '../workflow/lib/canonicalData';
12
+ import {typedValue,parseTypedValue} from '../workflow/lib/typedValue';
13
+ import type {VerificationObservation,TypedValue} from '../workflow/lib/evidencePorts';
14
+ import type {WorkflowStep} from '../workflow/lib/parameters';
15
+ import type {WorkflowHre} from '../workflow/lib/context';
16
+ import {WorkflowState} from '../workflow/lib/state';
17
+ import {validateContractInfo,resolveDeployment,type ContractInfo} from '../workflow/lib/deployments';
18
+ import {validateDeploymentInfo,type DeploymentInfo} from '../workflow/lib/deploymentInfo';
19
+ import type {DeploymentChange} from '../workflow/lib/deploymentRecords';
20
+ import {runDeliverySteps} from './engine';
21
+ import {VerificationJournal,parseVerificationObservation} from './verification';
22
+ import {parseDeliveryPlan} from './plan';
23
+ import {DeliveryOperationIdentities} from './identities';
24
+ import {parsePreparationJournal,type PreparationEntry} from './journal';
25
+ import type {DeliveryCollection} from './planning';
26
+ import type {DeliveryAggregate,DeliveryAggregateOptions} from './aggregate';
27
+ import {openAggregateSources} from './aggregate-inputs';
28
+ import {loadDeliveryPublicTarget} from './config';
29
+ import {inputDigest,readInputBytes} from './input-files';
30
+ import {createDeliveryEoaExecution,type EoaExecutionOptions,type EoaHashReferences} from './eoa';
31
+ import {byteHash,fileBytes,readDevelopmentJournal,atomicDevelopmentWrite,withDevelopmentFileLock,commitDevelopmentFilesLocked,type DevelopmentFile} from './materialization';
32
+ import {runDevelopmentCheckCode,validateDevelopmentCheckReport,type ExpectedDevelopmentCode} from './check-code';
33
+ const same=(a:unknown,b:unknown,label:string)=>{if(canonicalJson(a)!==canonicalJson(b))throw Error(`${label} mismatch`);};
34
+ const json=(v:unknown)=>canonicalJson(v)+'\n';
35
+ function value(raw:TypedValue):any {const v=parseTypedValue(raw);switch(v.type){case 'bigint':return BigInt(v.value as string).toString();case 'number':return Number(v.value);case 'array':return v.value.map(value);case 'object':return Object.fromEntries(Object.entries(v.value).map(([k,x])=>[k,value(x)]));default:return v.value;}}
36
+ function operations(plan:DeliveryCollection['plan'],steps:readonly WorkflowStep[]):WorkflowStep[] {
37
+ if(new Set(steps.map(s=>s.id)).size!==steps.length)throw Error('Duplicate frozen source');
38
+ same(steps.filter(s=>s.kind==='custom').map(s=>s.id),plan.customBindings.map(c=>c.sourceStepId),'Frozen custom source coverage');
39
+ const ids=new DeliveryOperationIdentities(),result:WorkflowStep[]=[];
40
+ for(const source of steps){
41
+ const descriptors=source.kind==='custom'?plan.customBindings.find(c=>c.sourceStepId===source.id)!.operations:[source];
42
+ for(const operation of descriptors){
43
+ const stepId=ids.register(source.id,source.kind==='custom'?operation.id:null,operation.kind);
44
+ result.push({...operation,id:stepId});
45
+ }
46
+ }
47
+ same(ids.seal(),plan.operationBindings,'Frozen operation coverage');return result;
48
+ }
49
+ export function expectedDevelopmentAssertions(collection:Pick<DeliveryCollection,'plan'|'verification'>,steps:readonly WorkflowStep[]):VerificationObservation[] {
50
+ const plan=parseDeliveryPlan(collection.plan),observations=collection.verification.map(parseVerificationObservation);
51
+ if(!observations.length||!plan.verificationBindings.length)throw Error('Development acceptance requires nonempty business assertions');
52
+ const checks=operations(plan,steps).filter(s=>s.kind==='check');
53
+ if(checks.length!==plan.verificationBindings.length)throw Error('Incomplete frozen business assertion set');
54
+ const expected:VerificationObservation[]=[];
55
+ for(const [i,step] of checks.entries()){
56
+ const binding=plan.verificationBindings[i],calls=step.calls as any[];
57
+ if(binding.stepId!==step.id||!Array.isArray(calls)||!calls.length)throw Error('Business assertion step identity mismatch');
58
+ const rows=observations.filter(o=>o.stepId===step.id);
59
+ same(binding.assertionIds,calls.map((_,index)=>`${step.id}:${index}`),'Expected assertion IDs');same(rows.map(o=>o.assertionId),binding.assertionIds,'Complete assertions');same(semanticHash(rows),binding.verificationHash,'Frozen verification hash');
60
+ for(const [index,observation] of rows.entries()){
61
+ const call=calls[index];same(observation.definition,{method:call.method,args:typedValue(call.args??[]),expect:typedValue(call.expect)},'Frozen assertion definition');
62
+ if(observation.contract!==step.contract||observation.abiName!==(step.abi??step.contract))throw Error('Business assertion ABI identity mismatch');expected.push(observation);
63
+ }
64
+ }
65
+ same(expected,observations,'Ordered assertion set');return deepFreeze(expected);
66
+ }
67
+ /** Pure candidate merge; preparations must come from the sealed journal parser. */
68
+ export function mergeDevelopmentRegistration(input:{
69
+ registry:unknown;metadata:unknown;base:{registry:ContractInfo;metadata:DeploymentInfo};
70
+ target:string;deploymentId:string;executionId:string;recordPath:string;updatedAt:string;
71
+ changes:readonly (DeploymentChange&{address:string;proxyKind?:'uups'})[];preparations:readonly PreparationEntry[];
72
+ }):{registry:ContractInfo;metadata:DeploymentInfo} {
73
+ const {base,target}=input,registry=validateContractInfo(input.registry),metadata=validateDeploymentInfo(input.metadata);
74
+ registry[target]??={};metadata.networks[target]??={};
75
+ for(const c of input.changes){
76
+ same(resolveDeployment(registry,target,c.instanceId)??null,resolveDeployment(base.registry,target,c.instanceId)??null,'Same-instance registry base');
77
+ same(metadata.networks[target][c.instanceId]??null,base.metadata.networks[target]?.[c.instanceId]??null,'Same-instance metadata base');
78
+ const previous=resolveDeployment(registry,target,c.instanceId);
79
+ if(previous&&previous.key!==c.contractInfoKey){
80
+ const entry=input.preparations.find(p=>p.stepId===c.stepId),request=entry?.prepared.request;
81
+ if(c.kind!=='upgrade'||c.proxyKind!=='uups'||entry?.change.kind!=='upgrade'||request?.kind!=='uups-upgrade'||entry.prepared.plan.kind!=='uups-upgrade'
82
+ ||entry.change.instanceId!==c.instanceId||entry.change.contractInfoKey!==c.contractInfoKey||entry.change.actualContract!==c.actualContract
83
+ ||previous.address.toLowerCase()!==request.proxy.toLowerCase()||previous.address.toLowerCase()!==c.address.toLowerCase()||c.proxyAddress?.toLowerCase()!==request.proxy.toLowerCase())throw Error('Contract candidate key conflict');
84
+ delete registry[target][previous.key];
85
+ }
86
+ if(previous&&previous.address.toLowerCase()!==c.address.toLowerCase()&&c.previousAddress?.toLowerCase()!==previous.address.toLowerCase())throw Error('Contract candidate address conflict');
87
+ registry[target][c.contractInfoKey]=c.address;
88
+ metadata.networks[target][c.instanceId]={contractInfoKey:c.contractInfoKey,address:c.address,actualContract:c.actualContract,...(c.proxyKind?{proxyKind:c.proxyKind,implementationAddress:c.implementationAddress}:{}),source:{kind:'deployment',deploymentId:input.deploymentId,executionId:input.executionId,recordPath:input.recordPath},updatedAt:input.updatedAt};
89
+ }
90
+ return {registry:validateContractInfo(registry),metadata:validateDeploymentInfo(metadata)};
91
+ }
92
+ export interface DevelopmentDeliveryOptions {
93
+ root:string;source:DeliveryAggregateOptions;aggregate:DeliveryAggregate;target:string;hre:WorkflowHre;
94
+ execution:Omit<EoaExecutionOptions,'plan'|'provider'>;
95
+ /** Optional durable file progress notification. Throwing leaves a recoverable file-only intent. */
96
+ onFileCommitted?:(path:string)=>void;
97
+ }
98
+ /** Persist the returned aggregate separately to resume; never rerun producers/scripts for sends. */
99
+ export async function createDevelopmentDelivery(options:DevelopmentDeliveryOptions) {
100
+ const root=fs.realpathSync(options.root),aggregate=deepFreeze(canonicalData(options.aggregate) as unknown as DeliveryAggregate),source=deepFreeze(canonicalData(options.source) as unknown as DeliveryAggregateOptions);
101
+ const collection=aggregate.collections.find(c=>c.plan.target===options.target);if(!collection)throw Error('Missing selected aggregate collection');
102
+ const plan=parseDeliveryPlan(collection.plan),target=aggregate.inputs.business.targets.find(t=>t.id===plan.target);
103
+ if(plan.environment!=='dev'||!target||target.environment!=='dev'||source.selection!=='development'||source.targets.length!==1||source.targets[0].executionId!==plan.executionId||source.targets[0].request.network!==plan.target)throw Error('Development source/target identity mismatch');
104
+ if(fs.realpathSync(path.resolve(source.workspaceRoot,source.projectRoot))!==root)throw Error('Development project root mismatch');
105
+ const expected=expectedDevelopmentAssertions(collection,aggregate.inputs.business.steps);
106
+ const preparations=parsePreparationJournal(collection.preparations,plan.transactions,plan.derivedBindings,{target:plan.target,chainId:plan.chainId,expectedStepIds:plan.deploymentBindings.map(b=>b.stepId)});
107
+ same(preparations.map(p=>({stepId:p.stepId,preparationHash:p.preparationHash,transactionIds:p.mappings.map(m=>m.transactionId),derivedKeys:p.derivedKeys})),plan.deploymentBindings,'Sealed preparation bindings');
108
+ if(!plan.transactions.length)throw Error('Development acceptance requires actual transactions');
109
+ const rows=aggregate.inputs.targets;
110
+ const computed=semanticHash({version:1,business:aggregate.inputs.business,sourceDefinitions:aggregate.inputs.sourceDefinitions,runtime:aggregate.inputs.runtime,files:aggregate.inputs.files,targets:rows.map(row=>({target:row.target,configuration:row.configuration.configurationRuntimeHash,sourceConfiguration:row.sourceConfiguration.configurationRuntimeHash,compiler:row.compiler.stableDigest,custom:row.custom}))});
111
+ same(plan.deploymentId,aggregate.inputs.business.deploymentId,'Business deployment identity');same(computed,aggregate.inputsHash,'Aggregate input hash');same(plan.inputsHash,computed,'Plan inputs');same(plan.sourceDefinitionHash,aggregate.sourceDefinitionHash,'Plan source');same(semanticHash(aggregate.inputs.sourceDefinitions),aggregate.sourceDefinitionHash,'Source hash');
112
+ const hre=options.hre,provider={request:(method:string,params:readonly unknown[])=>hre.network.provider.request({method,params:[...params]})};
113
+ if(options.execution.context.finality.kind==='confirmations'&&BigInt(options.execution.context.finality.depth)<BigInt(Math.max(1,target.finality.confirmations)))throw Error('Development finality below configured policy');
114
+ const identity=semanticHash({schema:'gate-delivery-development',version:1,executionId:plan.executionId,planHash:plan.planHash,target:plan.target,inputsHash:computed,sourceDefinitionHash:plan.sourceDefinitionHash,runtimeIdentity:plan.runtimeIdentity,context:options.execution.context});
115
+ const recordPath=`scripts/tasks/${plan.deploymentId}/results/${plan.target}/${plan.executionId}/deployment.json`,sessionPath=`.gate-delivery/development/${plan.executionId}.json`;
116
+ async function assertCurrent(){
117
+ if(createRequire(path.join(root,'package.json'))('hardhat')!==hre)throw Error('Development requires the actual validated project HRE');
118
+ const observation=openDeliveryConfiguration({workspaceRoot:source.workspaceRoot,projectRoot:source.projectRoot,network:plan.target});
119
+ try {
120
+ // Each observation independently validates every extender against the actual
121
+ // pinned adapter. The source worker additionally installs its context guard;
122
+ // that startup callback is not a semantic execution configuration difference.
123
+ const current=observation.seal().configuration;
124
+ const frozen=JSON.parse(canonicalJson(rows.find(r=>r.target===plan.target)!.sourceConfiguration.configuration));
125
+ // Remove exactly the optional guard registered in our verified hardhat entry.
126
+ // Preserve every other callback's identity, count, kind, and execution order.
127
+ const adapter=fs.readFileSync(path.join(__dirname,'hardhat.js'),'utf8'),ast=ts.createSourceFile('hardhat.js',adapter,ts.ScriptTarget.Latest,true,ts.ScriptKind.JS),guards:string[]=[];
128
+ const visit=(node:ts.Node):void=>{if(ts.isCallExpression(node)&&node.expression.getText(ast)==='extendEnvironment'&&node.arguments.length===1){const callback=node.arguments[0];if(ts.isArrowFunction(callback)&&callback.getText(ast).includes('Actual HRE network conflict: expected'))guards.push(semanticHash(callback.getText(ast)));}ts.forEachChild(node,visit);};visit(ast);
129
+ if(guards.length!==1)throw Error('Owned context guard identity unavailable');
130
+ for(const row of frozen.extenders){const active=current.extenders.find((x:any)=>x.kind===row.kind);if(row.kind==='extendEnvironment'&&active&&row.callbacks.length===active.callbacks.length+1){if(row.callbacks.filter((x:string)=>x===guards[0]).length!==1)throw Error('Unexpected context extender difference');row.callbacks=row.callbacks.filter((x:string)=>x!==guards[0]);}}
131
+ same(current,frozen,'Actual development runtime configuration');
132
+ }finally{observation.close();}
133
+ await yieldCompilerIo();
134
+ if(path.resolve(hre.config.paths.root)!==root||hre.network.name!==plan.target||(hre.network.config as any).zksync===true)throw Error('Development HRE/root/target mismatch');
135
+ same(loadDeliveryPublicTarget(root,plan.target,'dev'),target,'Current target');
136
+ if(String((await hre.ethers.provider.getNetwork()).chainId)!==plan.chainId||BigInt(await provider.request('eth_chainId',[]) as string).toString()!==plan.chainId)throw Error('Development provider chain mismatch');
137
+ const current=openAggregateSources({workspaceRoot:source.workspaceRoot,projectRoot:source.projectRoot,requests:source.targets.map(t=>t.request)});same(current.definitions,aggregate.inputs.sourceDefinitions,'Current eligible source');
138
+ for(const file of aggregate.inputs.files)if(inputDigest(readInputBytes(root,file.path))!==file.digest)throw Error(`Current immutable input changed: ${file.path}`);
139
+ same(JSON.parse(fs.readFileSync(path.join(__dirname,'../runtime-identity.json'),'utf8')),plan.runtimeIdentity,'Current runtime');
140
+ await yieldCompilerIo();
141
+ }
142
+ async function assertArtifacts(){
143
+ const artifacts=[];
144
+ for(const prep of preparations){const artifact=await hre.artifacts.readArtifact(prep.prepared.plan.contract);same(artifactIdentity(artifact,'evm'),prep.prepared.plan.artifact,'Actual artifact');artifacts.push(artifactIdentity(artifact,'evm'));}
145
+ const compiler=rows.find(r=>r.target===plan.target)!.compiler;
146
+ for(const artifact of compiler.artifacts){if(inputDigest(readInputBytes(root,artifact.path))!==inputDigest(artifact.contents))throw Error('CheckCode compilation artifact drift');}
147
+ return preparations.length?artifacts:pureCoverage().artifacts;
148
+ }
149
+ await assertCurrent();
150
+ const base=await withDevelopmentFileLock(root,async()=>{
151
+ const old=fileBytes(root,sessionPath);if(old!==null){const session=JSON.parse(old);if(session.identity!==identity||session.planHash!==plan.planHash||session.recordPath!==recordPath)throw Error('Development session identity conflict');return session;}
152
+ const paths=resolveTargetManifestPaths(root,plan.target,Number(plan.chainId),{}),manifestPath=path.relative(root,paths.file).split(path.sep).join('/');
153
+ if(paths.file!==paths.fallbackFile&&fileBytes(root,path.relative(root,paths.fallbackFile))!==null)throw Error('Noncanonical manifest fallback requires explicit migration');
154
+ const manifestBytes=fileBytes(root,manifestPath),manifests=manifestBytes===null?[]:[{path:manifestPath,contents:manifestBytes}];
155
+ const session={version:1,manifests,identity,planHash:plan.planHash,recordPath,registry:validateContractInfo(JSON.parse(fileBytes(root,'contractInfo.json')??'{}')),metadata:validateDeploymentInfo(JSON.parse(fileBytes(root,'deploymentInfo.json')??'{"version":1,"networks":{}}'))};
156
+ atomicDevelopmentWrite(root,sessionPath,json(session));return session;
157
+ });
158
+ function pureCoverage(){return existingCodeCoverage({target:plan.target,addresses:requiredExistingAddresses(collection!),registry:base.registry,metadata:base.metadata,compiler:rows.find(r=>r.target===plan.target)!.compiler,manifests:base.manifests??[]});}
159
+ async function assertExistingCode(){
160
+ if(preparations.length)return;
161
+ const coverage=pureCoverage(),checker=new BytecodeChecker(hre,{},'evm');
162
+ for(const row of coverage.expected){const code=await hre.ethers.provider.getCode(row.address),local=await checker.getLocalBytecode(row.contract);if(code==='0x'||!checker.compareBytecode(code,local.bytecode,local.abi,local.immutableReferences).matches)throw Error('Existing development code mismatch');}
163
+ for(const m of coverage.manifests){if(byteHash(readInputBytes(root,m.file))!==m.hash)throw Error('Existing UUPS manifest changed');const storage=await provider.request('eth_getStorageAt',[m.proxy,'0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc','latest']);if(typeof storage!=='string'||storage.slice(-40).toLowerCase()!==m.implementation.slice(2))throw Error('Existing UUPS implementation changed');}
164
+ }
165
+ await assertArtifacts();await assertExistingCode();
166
+ const execution=createDeliveryEoaExecution({...options.execution,plan,provider});
167
+ async function verifyBusiness(){
168
+ const journal=new VerificationJournal(expected.map(o=>({stepId:o.stepId,callIndex:o.callIndex,assertionId:o.assertionId})));
169
+ const checks=plan.verificationBindings.map(binding=>{const checks=expected.filter(o=>o.stepId===binding.stepId),first=checks[0];return {id:binding.stepId,kind:'check',contract:first.contract,abi:first.abiName,address:first.address,calls:checks.map(o=>({method:o.method,args:value(o.args),expect:value(o.expected)}))};});
170
+ const context={root,taskId:plan.deploymentId,executionId:plan.executionId,taskDir:path.join(root,aggregate.inputs.business.businessRoot),targetId:plan.target,target:{...target!,openzeppelin:target!.openzeppelin!},targetParams:{},existingDeploymentPolicies:{},config:{},runtime:{hre},mode:'verify' as const,simulation:{},state:new WorkflowState(),externalCalls:[],operatorReceipts:[],reporter:{event(){},result(){}},verification:journal};
171
+ await runDeliverySteps(context,checks);
172
+ const actual=journal.seal();
173
+ for(const [i,o] of actual.entries()){
174
+ const frozen=expected[i];same({...o,definition:frozen.definition,actual:frozen.actual},{...frozen},'Actual business observation identity');
175
+ // Shared ABI comparison already checked typed actual vs expected, without coercing undefined.
176
+ }
177
+ if(actual.length!==expected.length)throw Error('Incomplete actual business observations');return actual.map((o,i)=>({...o,definition:expected[i].definition}));
178
+ }
179
+ async function deploymentState(){
180
+ const checker=new BytecodeChecker(hre,{},'evm'),changes=new Map<string,any>(),candidates=[];
181
+ for(const entry of preparations){
182
+ const p=entry.prepared.plan,r=entry.prepared.request;
183
+ for(const deployment of p.deployments){
184
+ if(deployment.initCodeHash&&'factory' in r&&getCreate2Address(r.factory,deployment.salt,deployment.initCodeHash).toLowerCase()!==deployment.address.toLowerCase())throw Error('Prepared CREATE2 address mismatch');
185
+ const code=await hre.ethers.provider.getCode(deployment.address);if(code==='0x')throw Error('Prepared deployment has no actual code');
186
+ const name=deployment.role==='proxy'?'@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy':p.contract;
187
+ const local=await checker.getLocalBytecode(name),comparison=checker.compareBytecode(code,local.bytecode,local.abi,local.immutableReferences);if(!comparison.matches)throw Error(`Prepared deployed code mismatch: ${name}`);
188
+ }
189
+ const deployed=p.deployments.find(d=>d.role==='proxy')?.address??('proxy' in r?r.proxy:p.deployments.find(d=>d.role==='contract')?.address);
190
+ if(!deployed)throw Error('Prepared deployment address missing');
191
+ const change={...entry.change,address:deployed,...(p.proxyKind==='uups'?{proxyAddress:deployed,proxyKind:'uups'}:{})};changes.set(change.instanceId,change);
192
+ }
193
+ for(const change of changes.values())if(change.proxyKind==='uups'){
194
+ const entry=[...preparations].reverse().find(p=>p.change.instanceId===change.instanceId)!;
195
+ const candidate=await prepareEvmManifestCandidate({root,scheme:'evm',network:plan.target,target:plan.target,proxy:change.address,contract:entry.prepared.plan.contract,constructorArgs:change.constructorArgs??[],skipTxHash:true,hre,compile:false});
196
+ const expectedImplementation=entry.prepared.plan.deployments.find(d=>d.role==='implementation')?.address??change.implementationAddress;
197
+ if(!expectedImplementation||candidate.implementation.toLowerCase()!==expectedImplementation.toLowerCase())throw Error('Final UUPS implementation mismatch');
198
+ same(candidate.artifact,entry.prepared.plan.artifact,'UUPS artifact');change.implementationAddress=candidate.implementation;candidates.push(candidate);
199
+ }
200
+ return {changes:[...changes.values()],candidates};
201
+ }
202
+ async function materialize(finalized:unknown,assertions:VerificationObservation[]){
203
+ const state=await deploymentState();await assertArtifacts();await assertExistingCode();
204
+ const result=await withDevelopmentFileLock(root,async()=>{
205
+ if(!preparations.length){const coverage=pureCoverage(),currentRegistry=validateContractInfo(JSON.parse(fileBytes(root,'contractInfo.json')??'{}')),currentMetadata=validateDeploymentInfo(JSON.parse(fileBytes(root,'deploymentInfo.json')??'{"version":1,"networks":{}}'));for(const alias of coverage.aliases){same(resolveDeployment(currentRegistry,plan.target,alias)??null,resolveDeployment(base.registry,plan.target,alias)??null,'Existing development registry');same(currentMetadata.networks[plan.target]?.[alias]??null,base.metadata.networks[plan.target]?.[alias]??null,'Existing development metadata');}}
206
+ const prior=readDevelopmentJournal(root,plan.executionId);
207
+ if(prior){
208
+ if(prior.identity!==identity)throw Error('Materialization execution identity conflict');
209
+ const allowed=[recordPath,'contractInfo.json','deploymentInfo.json',...new Set(state.candidates.map(c=>path.relative(root,c.paths.file).split(path.sep).join('/')))];
210
+ same(prior.files.map((f:any)=>f.path).sort(),allowed.sort(),'Materialization journal paths');
211
+ const record=JSON.parse(prior.files.find((f:any)=>f.path===recordPath).after);
212
+ same({identity:record.identity,executionId:record.executionId,planHash:record.planHash,preparations:record.preparations,finalized:record.finalized,assertions:record.assertions,changes:record.changes},{identity,executionId:plan.executionId,planHash:plan.planHash,preparations,finalized,assertions,changes:state.changes},'Materialization record evidence');
213
+ const nextRegistry=validateContractInfo(JSON.parse(prior.files.find((f:any)=>f.path==='contractInfo.json').after)),nextMetadata=validateDeploymentInfo(JSON.parse(prior.files.find((f:any)=>f.path==='deploymentInfo.json').after));
214
+ for(const c of state.changes){same(resolveDeployment(nextRegistry,plan.target,c.instanceId),{key:c.contractInfoKey,address:c.address},'Journal registry');const m=nextMetadata.networks[plan.target]?.[c.instanceId];if(!m||m.address.toLowerCase()!==c.address.toLowerCase()||m.actualContract!==c.actualContract||m.source.kind!=='deployment'||m.source.executionId!==plan.executionId||m.source.recordPath!==recordPath)throw Error('Journal metadata identity mismatch');}
215
+ return commitDevelopmentFilesLocked({root,executionId:plan.executionId,identity,files:prior.files.map(({path,before,after}:DevelopmentFile)=>({path,before,after}))},options.onFileCommitted);}
216
+ const registryBefore=fileBytes(root,'contractInfo.json'),metadataBefore=fileBytes(root,'deploymentInfo.json');
217
+ const {registry,metadata}=mergeDevelopmentRegistration({registry:JSON.parse(registryBefore??'{}'),metadata:JSON.parse(metadataBefore??'{"version":1,"networks":{}}'),base,target:plan.target,deploymentId:plan.deploymentId,executionId:plan.executionId,recordPath,updatedAt:new Date().toISOString(),changes:state.changes,preparations});
218
+ const files:DevelopmentFile[]=[{path:recordPath,before:fileBytes(root,recordPath),after:json({version:1,identity,taskId:plan.deploymentId,executionId:plan.executionId,network:plan.target,planHash:plan.planHash,inputsHash:plan.inputsHash,sourceDefinitionHash:plan.sourceDefinitionHash,runtimeIdentity:plan.runtimeIdentity,preparations,finalized,assertions,changes:state.changes})}];
219
+ if(files[0].before!==null)throw Error('Deployment record already exists without journal');
220
+ files.push({path:'contractInfo.json',before:registryBefore,after:state.changes.length?json(validateContractInfo(registry)):registryBefore??json(registry)},{path:'deploymentInfo.json',before:metadataBefore,after:state.changes.length?json(validateDeploymentInfo(metadata)):metadataBefore??json(metadata)});
221
+ const manifests=new Map<string,DevelopmentFile>();
222
+ for(const candidate of state.candidates){const relative=path.relative(root,candidate.paths.file).split(path.sep).join('/');if(candidate.paths.fallbackFile!==candidate.paths.file&&fs.existsSync(candidate.paths.fallbackFile))throw Error('Noncanonical manifest fallback requires explicit migration');
223
+ const old=manifests.get(relative),before=old?.before??fileBytes(root,relative),document=old?parseTargetManifest(Buffer.from(old.after)):before===null?{manifestVersion:'3.2',impls:{},proxies:[]}:parseTargetManifest(Buffer.from(before));
224
+ manifests.set(relative,{path:relative,before,after:json(mergeEvmManifestCandidate(document,candidate))});
225
+ }
226
+ files.push(...manifests.values());return commitDevelopmentFilesLocked({root,executionId:plan.executionId,identity,files},options.onFileCommitted);
227
+ });
228
+ for(const candidate of state.candidates){const manifest=parseTargetManifest(fs.readFileSync(candidate.paths.file)),entry=manifest.impls[candidate.versionKey];if(!entry||![entry.address,...(entry.allAddresses??[])].some(a=>a.toLowerCase()===candidate.implementation)||hashStorageLayout(entry.layout)!==candidate.layoutHash||!manifest.proxies.some(p=>p.address.toLowerCase()===candidate.proxy&&p.kind==='uups'))throw Error('Committed target manifest mismatch');}
229
+ return {journal:result,changes:state.changes,manifests:!preparations.length?pureCoverage().manifests:state.candidates.map(c=>({file:path.relative(root,c.paths.file),hash:byteHash(fs.readFileSync(c.paths.file)),layoutHash:c.layoutHash,proxy:c.proxy,implementation:c.implementation}))};
230
+ }
231
+ return Object.freeze({plan,
232
+ async continue(input:{unsigned?:unknown;hashReferences?:EoaHashReferences}={}){
233
+ await assertCurrent();await assertArtifacts();
234
+ // Reconciliation always precedes signing; a complete durable prefix can only resume file/verification work.
235
+ let result=await execution.reconcile(input.hashReferences);
236
+ if(result.status!=='complete'){
237
+ const active=plan.transactions[result.snapshot.completedCount];
238
+ if(active&&active.route!=='operator')return {status:'waiting-external-execution',execution:result};
239
+ if(input.unsigned===undefined)return {status:result.status,execution:result};
240
+ result=await execution.execute(input.unsigned);return {status:result.status,execution:result};
241
+ }
242
+ const assertions=await verifyBusiness(),finalized=result.snapshot.transactions.map(t=>t.observation!);
243
+ const materialization=await materialize(finalized,assertions);
244
+ const registry=fileBytes(root,'contractInfo.json')!,metadata=fileBytes(root,'deploymentInfo.json')!,effective:Record<string,Record<string,string>>={[plan.target]:{}},expectedCode:ExpectedDevelopmentCode[]=[];
245
+ for(const c of materialization.changes){effective[plan.target][c.contractInfoKey]=c.address;const alias=c.contractInfoKey.includes(':')?c.contractInfoKey.split(':')[0]:c.contractInfoKey;expectedCode.push({key:alias,contract:c.actualContract,address:c.implementationAddress??c.address});if(c.proxyKind==='uups')expectedCode.push({key:`${alias}_Proxy`,contract:'ERC1967Proxy',address:c.address});}
246
+ if(!preparations.length){const coverage=pureCoverage();Object.assign(effective,coverage.effective);expectedCode.push(...coverage.expected);}
247
+ const acceptancePath=`.gate-delivery/development/${plan.executionId}.acceptance.json`,priorAcceptance=fileBytes(root,acceptancePath);
248
+ if(priorAcceptance!==null){
249
+ const saved=JSON.parse(priorAcceptance),code=saved.checkCode;
250
+ same({identity:saved.identity,executionId:saved.executionId,planHash:saved.planHash,target:saved.target,inputsHash:saved.inputsHash,sourceDefinitionHash:saved.sourceDefinitionHash,runtimeIdentity:saved.runtimeIdentity,finalized:saved.finalized,assertions:saved.assertions,materialization:saved.materialization},{identity,executionId:plan.executionId,planHash:plan.planHash,target:plan.target,inputsHash:plan.inputsHash,sourceDefinitionHash:plan.sourceDefinitionHash,runtimeIdentity:plan.runtimeIdentity,finalized,assertions,materialization:{intentHash:materialization.journal.intentHash,recordPath,manifests:materialization.manifests}},'Saved development acceptance');
251
+ if(saved.version!==1||saved.status!=='accepted'||code?.version!==1||code.executionId!==plan.executionId||code.planHash!==plan.planHash||code.target!==plan.target||typeof code.rawFile!=='string'||!code.rawFile.startsWith(`.gate-delivery/check-code/${plan.executionId}/`)||code.registryHash!==byteHash(registry)||code.metadataHash!==byteHash(metadata)||code.effectiveHash!==byteHash(json(effective)))throw Error('Saved CheckCode identity mismatch');
252
+ const raw=fileBytes(root,code.rawFile);if(raw===null||byteHash(raw)!==code.rawHash)throw Error('Saved CheckCode raw bytes mismatch');validateDevelopmentCheckReport(JSON.parse(raw),plan.target,expectedCode);same(code.artifacts,await assertArtifacts(),'Saved CheckCode artifacts');
253
+ await assertCurrent();await execution.reconcile();return {status:'accepted',acceptance:deepFreeze(saved)};
254
+ }
255
+ const code=await runDevelopmentCheckCode({root,target:plan.target,executionId:plan.executionId,planHash:plan.planHash,manifestDir:target.openzeppelin!.manifestDir,registry,metadata,effective,expected:expectedCode,assertArtifacts});
256
+ await assertCurrent();await execution.reconcile();
257
+ const acceptance=deepFreeze({version:1,status:'accepted',identity,executionId:plan.executionId,planHash:plan.planHash,target:plan.target,inputsHash:plan.inputsHash,sourceDefinitionHash:plan.sourceDefinitionHash,runtimeIdentity:plan.runtimeIdentity,finalized,assertions,materialization:{intentHash:materialization.journal.intentHash,recordPath,manifests:materialization.manifests},checkCode:code});
258
+ atomicDevelopmentWrite(root,`.gate-delivery/development/${plan.executionId}.acceptance.json`,json(acceptance));return {status:'accepted',acceptance};
259
+ },
260
+ export:()=>execution.export(),
261
+ });
262
+ }
@@ -0,0 +1,29 @@
1
+ import type { ReferenceObservation } from './references';
2
+ import { createDeliveryValidation } from './validation';
3
+ import { strictData } from './data';
4
+ import type { WorkflowContext } from "../workflow/lib/context";
5
+ import type { WorkflowStep } from "../workflow/lib/parameters";
6
+ import { runWorkflowSteps } from "../workflow/engine";
7
+
8
+ export type DeliveryStepContext = Omit<WorkflowContext, "mode"> & {
9
+ mode: "simulate" | "verify";
10
+ };
11
+
12
+ // Step execution only. The delivery launcher owns fork lifecycle and future
13
+ // qualification sealing; durable transaction execution has a separate API.
14
+ export const runDeliverySteps = async (
15
+ context: DeliveryStepContext,
16
+ steps: readonly WorkflowStep[],
17
+ ): Promise<{ references: readonly ReferenceObservation[] }> => {
18
+ if (context.mode !== "simulate" && context.mode !== "verify") {
19
+ throw new Error("Delivery step engine only supports simulate and verify");
20
+ }
21
+ steps = strictData(steps);
22
+ if (steps.some((step) => step.kind === "custom")) {
23
+ throw new Error("Delivery custom operations require the separate planning API");
24
+ }
25
+ const validation = createDeliveryValidation(context);
26
+ await validation.preflight(steps);
27
+ await runWorkflowSteps({ ...context, validation }, steps);
28
+ return Object.freeze({ references: validation.observations() });
29
+ };
@@ -0,0 +1,106 @@
1
+ import { deepFreeze, digest, exactObject } from '../workflow/lib/canonicalData';
2
+ import { immutableDeliveryPlan } from './export';
3
+ import { strictData } from './data';
4
+ import { same, type SignedRecord, type UnsignedEnvelope } from './execution-model';
5
+ import { verifyEoaSigned } from './eoa-signed';
6
+ import { hash32, uint256, type TransactionObservation } from './observations';
7
+ import type { DeliveryPlan } from './plan';
8
+
9
+ export class EoaRpcFailure extends Error { constructor(cause: unknown) { super(`EOA RPC failed: ${cause instanceof Error ? cause.message : String(cause)}`, { cause }); } }
10
+ export interface EoaRpc { request(method: string, params: readonly unknown[]): Promise<unknown>; }
11
+ export type EoaFinality = { kind: 'rpc_finalized' } | { kind: 'confirmations'; depth: string };
12
+ export interface EoaExecutionContext {
13
+ executionId: string; planHash: string; releaseHash: string; operator: string;
14
+ policyHash: string; chainId: string; target: string; finality: EoaFinality;
15
+ }
16
+ export function executionContext(raw: unknown, plan: DeliveryPlan): EoaExecutionContext {
17
+ const c = exactObject(strictData(raw), ['executionId','planHash','releaseHash','operator','policyHash','chainId','target','finality'], 'EOA execution context');
18
+ for (const key of ['executionId','planHash','operator','chainId','target'] as const) if (c[key] !== plan[key]) throw new Error(`Execution context ${key} mismatch`);
19
+ digest(c.releaseHash, 'release'); digest(c.policyHash, 'policy');
20
+ const f = c.finality as EoaFinality;
21
+ exactObject(f, f?.kind === 'rpc_finalized' ? ['kind'] : ['kind','depth'], 'finality policy');
22
+ if (f.kind !== 'rpc_finalized' && (f.kind !== 'confirmations' || BigInt(uint256(f.depth, 'confirmation depth')) < 1n)) throw new Error('Invalid explicit finality policy');
23
+ return deepFreeze(c as unknown as EoaExecutionContext);
24
+ }
25
+ function object(v: unknown, label: string): Record<string, unknown> { if (!v || typeof v !== 'object' || Array.isArray(v)) throw new Error(`Invalid RPC ${label}`); return v as Record<string, unknown>; }
26
+ export function rpcQuantity(v: unknown): string {
27
+ // Some providers zero-pad hex quantities. Parse exactly with BigInt, never Number.
28
+ if (typeof v !== 'string' || !/^0x[0-9a-fA-F]+$/.test(v)) throw new Error('Invalid RPC quantity');
29
+ return uint256(BigInt(v).toString(), 'RPC quantity');
30
+ }
31
+ function address(v: unknown): string { if (typeof v !== 'string' || !/^0x[0-9a-fA-F]{40}$/.test(v)) throw new Error('Invalid RPC address'); return v.toLowerCase(); }
32
+ function bytes(v: unknown): string { if (typeof v !== 'string' || !/^0x(?:[0-9a-fA-F]{2})*$/.test(v)) throw new Error('Invalid RPC bytes'); return v.toLowerCase(); }
33
+ function hash(v: unknown): string { return hash32(bytes(v), 'RPC hash'); }
34
+ const tag = (v: string) => '0x' + BigInt(v).toString(16);
35
+ export async function verifyEoaChain(provider: EoaRpc, context: EoaExecutionContext): Promise<void> {
36
+ if (rpcQuantity(await provider.request('eth_chainId', [])) !== context.chainId) throw new Error('RPC chain identity mismatch');
37
+ }
38
+ export async function verifyEoaCode(provider: EoaRpc, executor: string, block: string): Promise<void> {
39
+ if (await provider.request('eth_getCode', [executor, block]) !== '0x') throw new Error('Unsupported executor: EOA with empty code required');
40
+ }
41
+ function rpcEnvelope(tx: Record<string, unknown>): UnsignedEnvelope {
42
+ const typeString = rpcQuantity(tx.type);
43
+ if (!['0','1','2'].includes(typeString)) throw new Error('Unsupported RPC transaction type');
44
+ const type = Number(typeString) as 0 | 1 | 2;
45
+ const accessList = type === 0 ? [] : (() => {
46
+ if (!Array.isArray(tx.accessList)) throw new Error('Missing RPC access list');
47
+ return tx.accessList.map(item => { const a = object(item, 'access list'); if (!Array.isArray(a.storageKeys)) throw new Error('Invalid RPC storage keys'); return { address: address(a.address), storageKeys: a.storageKeys.map(hash) }; });
48
+ })();
49
+ if (type === 0 && tx.accessList !== undefined && !same(tx.accessList, [])) throw new Error('Legacy RPC access list mismatch');
50
+ let chainId: string;
51
+ if (type === 0) {
52
+ // EIP-155 legacy JSON-RPC responses need not expose chainId. The protected
53
+ // signature's v is the chain identity; never substitute the current RPC chain.
54
+ const v = BigInt(rpcQuantity(tx.v));
55
+ if (v < 37n) throw new Error('Unprotected legacy RPC chain identity');
56
+ chainId = ((v - 35n) / 2n).toString();
57
+ if (tx.chainId !== undefined && rpcQuantity(tx.chainId) !== chainId) throw new Error('Legacy RPC chainId/v mismatch');
58
+ } else chainId = rpcQuantity(tx.chainId);
59
+ return { chainId, signer: address(tx.from), nonce: rpcQuantity(tx.nonce), to: address(tx.to), value: rpcQuantity(tx.value), data: bytes(tx.input), operation: 0, type, gasLimit: rpcQuantity(tx.gas), gasPrice: type === 2 ? null : rpcQuantity(tx.gasPrice), maxFeePerGas: type === 2 ? rpcQuantity(tx.maxFeePerGas) : null, maxPriorityFeePerGas: type === 2 ? rpcQuantity(tx.maxPriorityFeePerGas) : null, accessList };
60
+ }
61
+ export function eoaObservationReference(transactionId: string, transactionHash: string): string { return `${transactionId}@${hash32(transactionHash, 'transaction hash')}`; }
62
+ export interface EoaObservationRequest {
63
+ plan: unknown; context: EoaExecutionContext; provider: EoaRpc; index: number; transactionHash: string;
64
+ original?: { unsigned: UnsignedEnvelope; signed: SignedRecord };
65
+ }
66
+ /** Finite, read-only hash query. Missing RPC results remain pending. No block scanning or fallback finality. */
67
+ export async function observeEoaTransaction(input: EoaObservationRequest): Promise<TransactionObservation | undefined> {
68
+ const plan = immutableDeliveryPlan(input.plan), context = executionContext(input.context, plan), { index } = input;
69
+ const provider: EoaRpc = { async request(method, params) { try { return await input.provider.request(method, params); } catch (error) { throw new EoaRpcFailure(error); } } };
70
+ const expected = plan.transactions[index], transactionHash = hash32(input.transactionHash, 'transaction hash');
71
+ if (!expected) throw new Error('Unknown plan transaction index');
72
+ if (expected.operation !== 0) throw new Error('Unsupported EOA operation');
73
+ await verifyEoaChain(provider, context);
74
+ const txRaw = await provider.request('eth_getTransactionByHash', [transactionHash]);
75
+ const receiptRaw = await provider.request('eth_getTransactionReceipt', [transactionHash]);
76
+ if (txRaw === null || receiptRaw === null) return;
77
+ const tx = object(txRaw, 'transaction'), receipt = object(receiptRaw, 'receipt'), actual = rpcEnvelope(tx);
78
+ if (hash(tx.hash) !== transactionHash || hash(receipt.transactionHash) !== transactionHash || actual.chainId !== plan.chainId || actual.signer !== expected.executor || actual.to !== expected.to || actual.value !== expected.value || actual.data !== expected.data || address(receipt.from) !== expected.executor || address(receipt.to) !== expected.to) throw new Error('RPC transaction/receipt identity mismatch');
79
+ if (input.original) {
80
+ const signed = verifyEoaSigned(input.original.signed.rawTransaction, input.original.unsigned);
81
+ if (!same(signed, input.original.signed) || signed.transactionHash !== transactionHash || !same(actual, input.original.unsigned)) throw new Error('RPC transaction differs from original signed envelope');
82
+ }
83
+ if (tx.blockHash === null || tx.blockNumber === null || tx.transactionIndex === null) return;
84
+ const blockHash = hash(receipt.blockHash), blockNumber = rpcQuantity(receipt.blockNumber), indexString = rpcQuantity(receipt.transactionIndex);
85
+ if (hash(tx.blockHash) !== blockHash || rpcQuantity(tx.blockNumber) !== blockNumber || rpcQuantity(tx.transactionIndex) !== indexString) throw new Error('RPC inclusion identity mismatch');
86
+ const canonicalRaw = await provider.request('eth_getBlockByNumber', [tag(blockNumber), false]);
87
+ if (canonicalRaw === null) return;
88
+ const canonical = object(canonicalRaw, 'canonical block');
89
+ if (hash(canonical.hash) !== blockHash) return; // Unfinalized reorg: reread the same hash later.
90
+ if (rpcQuantity(canonical.number) !== blockNumber || !Array.isArray(canonical.transactions) || BigInt(indexString) >= BigInt(canonical.transactions.length) || hash(canonical.transactions[Number(indexString)]) !== transactionHash) throw new Error('RPC canonical inclusion mismatch');
91
+ await verifyEoaCode(provider, expected.executor, tag(blockNumber));
92
+ const headRaw = await provider.request('eth_getBlockByNumber', [context.finality.kind === 'rpc_finalized' ? 'finalized' : 'latest', false]);
93
+ if (headRaw === null) return;
94
+ const head = object(headRaw, 'finality block'), headNumber = rpcQuantity(head.number), headHash = hash(head.hash);
95
+ const headCanonicalRaw = await provider.request('eth_getBlockByNumber', [tag(headNumber), false]);
96
+ if (headCanonicalRaw === null) return;
97
+ const headCanonical = object(headCanonicalRaw, 'canonical finality block');
98
+ if (hash(headCanonical.hash) !== headHash || rpcQuantity(headCanonical.number) !== headNumber) return;
99
+ // Close the observation window by rereading inclusion after finality/code queries.
100
+ const endRaw = await provider.request('eth_getBlockByNumber', [tag(blockNumber), false]);
101
+ if (endRaw === null || hash(object(endRaw, 'canonical block').hash) !== blockHash) return;
102
+ const finalized = context.finality.kind === 'rpc_finalized' ? BigInt(headNumber) >= BigInt(blockNumber) : BigInt(headNumber) - BigInt(blockNumber) + 1n >= BigInt(context.finality.depth);
103
+ const status = rpcQuantity(receipt.status);
104
+ if (status !== '0' && status !== '1') throw new Error('Invalid RPC receipt status');
105
+ return deepFreeze({ observationId: eoaObservationReference(expected.transactionId, transactionHash), executionId: plan.executionId, planHash: plan.planHash, chainId: plan.chainId, target: plan.target, transaction: expected, transactionHash, state: finalized ? status === '1' ? 'finalized-success' : 'finalized-reverted' : 'included-unfinalized', blockNumber, blockHash });
106
+ }
@@ -0,0 +1,55 @@
1
+ /** Exact EIP-155 / EIP-2930 / EIP-1559 signed bytes. No Number conversion of quantities. */
2
+ import { decodeRlp, encodeRlp, keccak256, recoverAddress } from 'ethers';
3
+ import { same, unsignedHash, type UnsignedEnvelope, type SignedRecord } from './execution-model';
4
+ import { uint256 } from './observations';
5
+
6
+ type Rlp = string | Rlp[];
7
+ function list(v: Rlp, length?: number): Rlp[] {
8
+ if (!Array.isArray(v) || (length !== undefined && v.length !== length)) throw new Error('Invalid signed RLP list');
9
+ return v;
10
+ }
11
+ function bytes(v: Rlp): string {
12
+ if (typeof v !== 'string' || !/^0x(?:[0-9a-f]{2})*$/.test(v)) throw new Error('Invalid signed RLP bytes');
13
+ return v;
14
+ }
15
+ function quantity(v: Rlp): string {
16
+ const b = bytes(v);
17
+ if (b.startsWith('0x00')) throw new Error('Noncanonical signed quantity');
18
+ return uint256(b === '0x' ? '0' : BigInt(b).toString(), 'signed quantity');
19
+ }
20
+ function address(v: Rlp): string {
21
+ const b = bytes(v);
22
+ if (!/^0x[0-9a-f]{40}$/.test(b)) throw new Error('Invalid signed destination/address');
23
+ return b;
24
+ }
25
+ function rlpQuantity(n: bigint): string { const s = n.toString(16); return n === 0n ? '0x' : '0x' + (s.length % 2 ? '0' : '') + s; }
26
+ export function verifyEoaSigned(raw: unknown, frozen: UnsignedEnvelope): SignedRecord {
27
+ if (frozen.operation !== 0) throw new Error('Unsupported EOA operation');
28
+ if (typeof raw !== 'string' || !/^0x(?:[0-9a-f]{2})+$/.test(raw)) throw new Error('Invalid signed bytes');
29
+ const first = parseInt(raw.slice(2, 4), 16), type = first >= 0xc0 ? 0 : first;
30
+ if (![0, 1, 2].includes(type)) throw new Error('Unsupported signed transaction type');
31
+ const prefix = type ? raw.slice(0, 4) : '0x', payload = type ? '0x' + raw.slice(4) : raw;
32
+ const fields = list(decodeRlp(payload) as Rlp, type === 0 ? 9 : type === 1 ? 11 : 12);
33
+ if (encodeRlp(fields) !== payload) throw new Error('Noncanonical signed RLP');
34
+ const unsigned = fields.slice(0, -3), [v, r, s] = fields.slice(-3).map(quantity);
35
+ let parity: bigint, chainId: string;
36
+ if (type === 0) {
37
+ if (BigInt(v) < 35n) throw new Error('Signed legacy transaction requires EIP-155 chain identity');
38
+ parity = (BigInt(v) - 35n) % 2n; chainId = ((BigInt(v) - 35n) / 2n).toString();
39
+ unsigned.push(rlpQuantity(BigInt(chainId)), '0x', '0x');
40
+ } else { chainId = quantity(fields[0]); parity = BigInt(v); }
41
+ if (parity > 1n) throw new Error('Invalid signed parity');
42
+ const signingHash = keccak256(prefix + encodeRlp(unsigned).slice(2));
43
+ const signer = recoverAddress(signingHash, { r: '0x' + BigInt(r).toString(16).padStart(64, '0'), s: '0x' + BigInt(s).toString(16).padStart(64, '0'), yParity: Number(parity) as 0 | 1 }).toLowerCase();
44
+ const offset = type ? 1 : 0, gasIndex = type === 2 ? 4 : offset + 2;
45
+ const accessList = type === 0 ? [] : list(fields[gasIndex + 4]).map(entry => {
46
+ const [a, keys] = list(entry, 2);
47
+ return { address: address(a), storageKeys: list(keys).map(k => { const b = bytes(k); if (!/^0x[0-9a-f]{64}$/.test(b)) throw new Error('Invalid signed storage key'); return b; }) };
48
+ });
49
+ const actual: UnsignedEnvelope = {
50
+ chainId, signer, nonce: quantity(fields[offset]), to: address(fields[gasIndex + 1]), value: quantity(fields[gasIndex + 2]), data: bytes(fields[gasIndex + 3]), operation: 0, type: type as 0 | 1 | 2,
51
+ gasLimit: quantity(fields[gasIndex]), gasPrice: type === 2 ? null : quantity(fields[offset + 1]), maxFeePerGas: type === 2 ? quantity(fields[3]) : null, maxPriorityFeePerGas: type === 2 ? quantity(fields[2]) : null, accessList,
52
+ };
53
+ if (!same(actual, frozen)) throw new Error('Actual signed transaction differs from frozen approval snapshot');
54
+ return { rawTransaction: raw, transactionHash: keccak256(raw), unsignedDigest: unsignedHash(frozen) };
55
+ }