@0xsequence/catapult 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/.eslintrc.json +29 -0
  2. package/.github/workflows/ci.yml +181 -0
  3. package/CONCEPT.md +24 -0
  4. package/README.md +772 -0
  5. package/contracts/checked-call.huff +65 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +16 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/common.d.ts +11 -0
  11. package/dist/commands/common.d.ts.map +1 -0
  12. package/dist/commands/common.js +73 -0
  13. package/dist/commands/common.js.map +1 -0
  14. package/dist/commands/dry.d.ts +3 -0
  15. package/dist/commands/dry.d.ts.map +1 -0
  16. package/dist/commands/dry.js +171 -0
  17. package/dist/commands/dry.js.map +1 -0
  18. package/dist/commands/etherscan.d.ts +3 -0
  19. package/dist/commands/etherscan.d.ts.map +1 -0
  20. package/dist/commands/etherscan.js +323 -0
  21. package/dist/commands/etherscan.js.map +1 -0
  22. package/dist/commands/index.d.ts +6 -0
  23. package/dist/commands/index.d.ts.map +1 -0
  24. package/dist/commands/index.js +22 -0
  25. package/dist/commands/index.js.map +1 -0
  26. package/dist/commands/list.d.ts +3 -0
  27. package/dist/commands/list.d.ts.map +1 -0
  28. package/dist/commands/list.js +259 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/run.d.ts +3 -0
  31. package/dist/commands/run.d.ts.map +1 -0
  32. package/dist/commands/run.js +96 -0
  33. package/dist/commands/run.js.map +1 -0
  34. package/dist/commands/utils.d.ts +3 -0
  35. package/dist/commands/utils.d.ts.map +1 -0
  36. package/dist/commands/utils.js +46 -0
  37. package/dist/commands/utils.js.map +1 -0
  38. package/dist/index.d.ts +4 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +58 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lib/__tests__/deployer-events.spec.d.ts +2 -0
  43. package/dist/lib/__tests__/deployer-events.spec.d.ts.map +1 -0
  44. package/dist/lib/__tests__/deployer-events.spec.js +260 -0
  45. package/dist/lib/__tests__/deployer-events.spec.js.map +1 -0
  46. package/dist/lib/__tests__/deployer.spec.d.ts +2 -0
  47. package/dist/lib/__tests__/deployer.spec.d.ts.map +1 -0
  48. package/dist/lib/__tests__/deployer.spec.js +884 -0
  49. package/dist/lib/__tests__/deployer.spec.js.map +1 -0
  50. package/dist/lib/__tests__/network-utils.spec.d.ts +2 -0
  51. package/dist/lib/__tests__/network-utils.spec.d.ts.map +1 -0
  52. package/dist/lib/__tests__/network-utils.spec.js +140 -0
  53. package/dist/lib/__tests__/network-utils.spec.js.map +1 -0
  54. package/dist/lib/contracts/__tests__/repository.spec.d.ts +2 -0
  55. package/dist/lib/contracts/__tests__/repository.spec.d.ts.map +1 -0
  56. package/dist/lib/contracts/__tests__/repository.spec.js +321 -0
  57. package/dist/lib/contracts/__tests__/repository.spec.js.map +1 -0
  58. package/dist/lib/contracts/repository.d.ts +27 -0
  59. package/dist/lib/contracts/repository.d.ts.map +1 -0
  60. package/dist/lib/contracts/repository.js +241 -0
  61. package/dist/lib/contracts/repository.js.map +1 -0
  62. package/dist/lib/core/__tests__/engine.spec.d.ts +2 -0
  63. package/dist/lib/core/__tests__/engine.spec.d.ts.map +1 -0
  64. package/dist/lib/core/__tests__/engine.spec.js +1212 -0
  65. package/dist/lib/core/__tests__/engine.spec.js.map +1 -0
  66. package/dist/lib/core/__tests__/graph.spec.d.ts +2 -0
  67. package/dist/lib/core/__tests__/graph.spec.d.ts.map +1 -0
  68. package/dist/lib/core/__tests__/graph.spec.js +116 -0
  69. package/dist/lib/core/__tests__/graph.spec.js.map +1 -0
  70. package/dist/lib/core/__tests__/json-integration.spec.d.ts +2 -0
  71. package/dist/lib/core/__tests__/json-integration.spec.d.ts.map +1 -0
  72. package/dist/lib/core/__tests__/json-integration.spec.js +300 -0
  73. package/dist/lib/core/__tests__/json-integration.spec.js.map +1 -0
  74. package/dist/lib/core/__tests__/loader.spec.d.ts +2 -0
  75. package/dist/lib/core/__tests__/loader.spec.d.ts.map +1 -0
  76. package/dist/lib/core/__tests__/loader.spec.js +288 -0
  77. package/dist/lib/core/__tests__/loader.spec.js.map +1 -0
  78. package/dist/lib/core/__tests__/multi-platform-verification.spec.d.ts +2 -0
  79. package/dist/lib/core/__tests__/multi-platform-verification.spec.d.ts.map +1 -0
  80. package/dist/lib/core/__tests__/multi-platform-verification.spec.js +342 -0
  81. package/dist/lib/core/__tests__/multi-platform-verification.spec.js.map +1 -0
  82. package/dist/lib/core/__tests__/resolver.spec.d.ts +2 -0
  83. package/dist/lib/core/__tests__/resolver.spec.d.ts.map +1 -0
  84. package/dist/lib/core/__tests__/resolver.spec.js +1367 -0
  85. package/dist/lib/core/__tests__/resolver.spec.js.map +1 -0
  86. package/dist/lib/core/__tests__/static-action.spec.d.ts +2 -0
  87. package/dist/lib/core/__tests__/static-action.spec.d.ts.map +1 -0
  88. package/dist/lib/core/__tests__/static-action.spec.js +136 -0
  89. package/dist/lib/core/__tests__/static-action.spec.js.map +1 -0
  90. package/dist/lib/core/context.d.ts +29 -0
  91. package/dist/lib/core/context.d.ts.map +1 -0
  92. package/dist/lib/core/context.js +88 -0
  93. package/dist/lib/core/context.js.map +1 -0
  94. package/dist/lib/core/engine.d.ts +25 -0
  95. package/dist/lib/core/engine.d.ts.map +1 -0
  96. package/dist/lib/core/engine.js +1191 -0
  97. package/dist/lib/core/engine.js.map +1 -0
  98. package/dist/lib/core/graph.d.ts +18 -0
  99. package/dist/lib/core/graph.d.ts.map +1 -0
  100. package/dist/lib/core/graph.js +158 -0
  101. package/dist/lib/core/graph.js.map +1 -0
  102. package/dist/lib/core/loader.d.ts +25 -0
  103. package/dist/lib/core/loader.d.ts.map +1 -0
  104. package/dist/lib/core/loader.js +248 -0
  105. package/dist/lib/core/loader.js.map +1 -0
  106. package/dist/lib/core/resolver.d.ts +20 -0
  107. package/dist/lib/core/resolver.d.ts.map +1 -0
  108. package/dist/lib/core/resolver.js +307 -0
  109. package/dist/lib/core/resolver.js.map +1 -0
  110. package/dist/lib/deployer.d.ts +39 -0
  111. package/dist/lib/deployer.d.ts.map +1 -0
  112. package/dist/lib/deployer.js +533 -0
  113. package/dist/lib/deployer.js.map +1 -0
  114. package/dist/lib/events/__tests__/event-system.spec.d.ts +2 -0
  115. package/dist/lib/events/__tests__/event-system.spec.d.ts.map +1 -0
  116. package/dist/lib/events/__tests__/event-system.spec.js +256 -0
  117. package/dist/lib/events/__tests__/event-system.spec.js.map +1 -0
  118. package/dist/lib/events/cli-adapter.d.ts +13 -0
  119. package/dist/lib/events/cli-adapter.d.ts.map +1 -0
  120. package/dist/lib/events/cli-adapter.js +244 -0
  121. package/dist/lib/events/cli-adapter.js.map +1 -0
  122. package/dist/lib/events/emitter.d.ts +11 -0
  123. package/dist/lib/events/emitter.d.ts.map +1 -0
  124. package/dist/lib/events/emitter.js +29 -0
  125. package/dist/lib/events/emitter.js.map +1 -0
  126. package/dist/lib/events/index.d.ts +4 -0
  127. package/dist/lib/events/index.d.ts.map +1 -0
  128. package/dist/lib/events/index.js +20 -0
  129. package/dist/lib/events/index.js.map +1 -0
  130. package/dist/lib/events/types.d.ts +368 -0
  131. package/dist/lib/events/types.d.ts.map +1 -0
  132. package/dist/lib/events/types.js +3 -0
  133. package/dist/lib/events/types.js.map +1 -0
  134. package/dist/lib/index.d.ts +5 -0
  135. package/dist/lib/index.d.ts.map +1 -0
  136. package/dist/lib/index.js +44 -0
  137. package/dist/lib/index.js.map +1 -0
  138. package/dist/lib/network-loader.d.ts +3 -0
  139. package/dist/lib/network-loader.d.ts.map +1 -0
  140. package/dist/lib/network-loader.js +80 -0
  141. package/dist/lib/network-loader.js.map +1 -0
  142. package/dist/lib/network-match.d.ts +3 -0
  143. package/dist/lib/network-match.d.ts.map +1 -0
  144. package/dist/lib/network-match.js +62 -0
  145. package/dist/lib/network-match.js.map +1 -0
  146. package/dist/lib/network-utils.d.ts +4 -0
  147. package/dist/lib/network-utils.d.ts.map +1 -0
  148. package/dist/lib/network-utils.js +39 -0
  149. package/dist/lib/network-utils.js.map +1 -0
  150. package/dist/lib/parsers/__tests__/buildinfo.spec.d.ts +2 -0
  151. package/dist/lib/parsers/__tests__/buildinfo.spec.d.ts.map +1 -0
  152. package/dist/lib/parsers/__tests__/buildinfo.spec.js +132 -0
  153. package/dist/lib/parsers/__tests__/buildinfo.spec.js.map +1 -0
  154. package/dist/lib/parsers/__tests__/job.spec.d.ts +2 -0
  155. package/dist/lib/parsers/__tests__/job.spec.d.ts.map +1 -0
  156. package/dist/lib/parsers/__tests__/job.spec.js +318 -0
  157. package/dist/lib/parsers/__tests__/job.spec.js.map +1 -0
  158. package/dist/lib/parsers/__tests__/template.spec.d.ts +2 -0
  159. package/dist/lib/parsers/__tests__/template.spec.d.ts.map +1 -0
  160. package/dist/lib/parsers/__tests__/template.spec.js +126 -0
  161. package/dist/lib/parsers/__tests__/template.spec.js.map +1 -0
  162. package/dist/lib/parsers/artifact/__tests__/artifact.spec.d.ts +2 -0
  163. package/dist/lib/parsers/artifact/__tests__/artifact.spec.d.ts.map +1 -0
  164. package/dist/lib/parsers/artifact/__tests__/artifact.spec.js +128 -0
  165. package/dist/lib/parsers/artifact/__tests__/artifact.spec.js.map +1 -0
  166. package/dist/lib/parsers/artifact/foundry-1.2.d.ts +3 -0
  167. package/dist/lib/parsers/artifact/foundry-1.2.d.ts.map +1 -0
  168. package/dist/lib/parsers/artifact/foundry-1.2.js +82 -0
  169. package/dist/lib/parsers/artifact/foundry-1.2.js.map +1 -0
  170. package/dist/lib/parsers/artifact/index.d.ts +3 -0
  171. package/dist/lib/parsers/artifact/index.d.ts.map +1 -0
  172. package/dist/lib/parsers/artifact/index.js +17 -0
  173. package/dist/lib/parsers/artifact/index.js.map +1 -0
  174. package/dist/lib/parsers/artifact/types.d.ts +3 -0
  175. package/dist/lib/parsers/artifact/types.d.ts.map +1 -0
  176. package/dist/lib/parsers/artifact/types.js +3 -0
  177. package/dist/lib/parsers/artifact/types.js.map +1 -0
  178. package/dist/lib/parsers/buildinfo.d.ts +5 -0
  179. package/dist/lib/parsers/buildinfo.d.ts.map +1 -0
  180. package/dist/lib/parsers/buildinfo.js +85 -0
  181. package/dist/lib/parsers/buildinfo.js.map +1 -0
  182. package/dist/lib/parsers/constants.d.ts +4 -0
  183. package/dist/lib/parsers/constants.d.ts.map +1 -0
  184. package/dist/lib/parsers/constants.js +45 -0
  185. package/dist/lib/parsers/constants.js.map +1 -0
  186. package/dist/lib/parsers/index.d.ts +5 -0
  187. package/dist/lib/parsers/index.d.ts.map +1 -0
  188. package/dist/lib/parsers/index.js +21 -0
  189. package/dist/lib/parsers/index.js.map +1 -0
  190. package/dist/lib/parsers/job.d.ts +3 -0
  191. package/dist/lib/parsers/job.d.ts.map +1 -0
  192. package/dist/lib/parsers/job.js +74 -0
  193. package/dist/lib/parsers/job.js.map +1 -0
  194. package/dist/lib/parsers/template.d.ts +3 -0
  195. package/dist/lib/parsers/template.d.ts.map +1 -0
  196. package/dist/lib/parsers/template.js +91 -0
  197. package/dist/lib/parsers/template.js.map +1 -0
  198. package/dist/lib/std/templates/assured-deployment.yaml +45 -0
  199. package/dist/lib/std/templates/erc-2470.yaml +67 -0
  200. package/dist/lib/std/templates/min-balance.yaml +32 -0
  201. package/dist/lib/std/templates/nano-universal-deployer.yaml +59 -0
  202. package/dist/lib/std/templates/raw-erc-2470.yaml +59 -0
  203. package/dist/lib/std/templates/raw-nano-universal-deployer.yaml +51 -0
  204. package/dist/lib/std/templates/raw-sequence-universal-deployer-2.yaml +48 -0
  205. package/dist/lib/std/templates/sequence-universal-deployer-2.yaml +57 -0
  206. package/dist/lib/types/__tests__/json-request-action.spec.d.ts +2 -0
  207. package/dist/lib/types/__tests__/json-request-action.spec.d.ts.map +1 -0
  208. package/dist/lib/types/__tests__/json-request-action.spec.js +219 -0
  209. package/dist/lib/types/__tests__/json-request-action.spec.js.map +1 -0
  210. package/dist/lib/types/__tests__/read-json-value.spec.d.ts +2 -0
  211. package/dist/lib/types/__tests__/read-json-value.spec.d.ts.map +1 -0
  212. package/dist/lib/types/__tests__/read-json-value.spec.js +233 -0
  213. package/dist/lib/types/__tests__/read-json-value.spec.js.map +1 -0
  214. package/dist/lib/types/actions.d.ts +74 -0
  215. package/dist/lib/types/actions.d.ts.map +1 -0
  216. package/dist/lib/types/actions.js +18 -0
  217. package/dist/lib/types/actions.js.map +1 -0
  218. package/dist/lib/types/artifacts.d.ts +15 -0
  219. package/dist/lib/types/artifacts.d.ts.map +1 -0
  220. package/dist/lib/types/artifacts.js +3 -0
  221. package/dist/lib/types/artifacts.js.map +1 -0
  222. package/dist/lib/types/buildinfo.d.ts +112 -0
  223. package/dist/lib/types/buildinfo.d.ts.map +1 -0
  224. package/dist/lib/types/buildinfo.js +3 -0
  225. package/dist/lib/types/buildinfo.js.map +1 -0
  226. package/dist/lib/types/conditions.d.ts +17 -0
  227. package/dist/lib/types/conditions.d.ts.map +1 -0
  228. package/dist/lib/types/conditions.js +21 -0
  229. package/dist/lib/types/conditions.js.map +1 -0
  230. package/dist/lib/types/contracts.d.ts +14 -0
  231. package/dist/lib/types/contracts.d.ts.map +1 -0
  232. package/dist/lib/types/contracts.js +3 -0
  233. package/dist/lib/types/contracts.js.map +1 -0
  234. package/dist/lib/types/definitions.d.ts +51 -0
  235. package/dist/lib/types/definitions.d.ts.map +1 -0
  236. package/dist/lib/types/definitions.js +3 -0
  237. package/dist/lib/types/definitions.js.map +1 -0
  238. package/dist/lib/types/index.d.ts +9 -0
  239. package/dist/lib/types/index.d.ts.map +1 -0
  240. package/dist/lib/types/index.js +25 -0
  241. package/dist/lib/types/index.js.map +1 -0
  242. package/dist/lib/types/network.d.ts +9 -0
  243. package/dist/lib/types/network.d.ts.map +1 -0
  244. package/dist/lib/types/network.js +3 -0
  245. package/dist/lib/types/network.js.map +1 -0
  246. package/dist/lib/types/project.d.ts +5 -0
  247. package/dist/lib/types/project.d.ts.map +1 -0
  248. package/dist/lib/types/project.js +3 -0
  249. package/dist/lib/types/project.js.map +1 -0
  250. package/dist/lib/types/task.d.ts +9 -0
  251. package/dist/lib/types/task.d.ts.map +1 -0
  252. package/dist/lib/types/task.js +3 -0
  253. package/dist/lib/types/task.js.map +1 -0
  254. package/dist/lib/types/values.d.ts +78 -0
  255. package/dist/lib/types/values.d.ts.map +1 -0
  256. package/dist/lib/types/values.js +3 -0
  257. package/dist/lib/types/values.js.map +1 -0
  258. package/dist/lib/utils/validation.d.ts +5 -0
  259. package/dist/lib/utils/validation.d.ts.map +1 -0
  260. package/dist/lib/utils/validation.js +77 -0
  261. package/dist/lib/utils/validation.js.map +1 -0
  262. package/dist/lib/validation/contract-references.d.ts +12 -0
  263. package/dist/lib/validation/contract-references.d.ts.map +1 -0
  264. package/dist/lib/validation/contract-references.js +112 -0
  265. package/dist/lib/validation/contract-references.js.map +1 -0
  266. package/dist/lib/validation/index.d.ts +1 -0
  267. package/dist/lib/validation/index.d.ts.map +1 -0
  268. package/dist/lib/validation/index.js +2 -0
  269. package/dist/lib/validation/index.js.map +1 -0
  270. package/dist/lib/verification/__tests__/etherscan.spec.d.ts +2 -0
  271. package/dist/lib/verification/__tests__/etherscan.spec.d.ts.map +1 -0
  272. package/dist/lib/verification/__tests__/etherscan.spec.js +565 -0
  273. package/dist/lib/verification/__tests__/etherscan.spec.js.map +1 -0
  274. package/dist/lib/verification/__tests__/sourcify.spec.d.ts +2 -0
  275. package/dist/lib/verification/__tests__/sourcify.spec.d.ts.map +1 -0
  276. package/dist/lib/verification/__tests__/sourcify.spec.js +212 -0
  277. package/dist/lib/verification/__tests__/sourcify.spec.js.map +1 -0
  278. package/dist/lib/verification/etherscan.d.ts +56 -0
  279. package/dist/lib/verification/etherscan.d.ts.map +1 -0
  280. package/dist/lib/verification/etherscan.js +340 -0
  281. package/dist/lib/verification/etherscan.js.map +1 -0
  282. package/dist/lib/verification/sourcify.d.ts +12 -0
  283. package/dist/lib/verification/sourcify.d.ts.map +1 -0
  284. package/dist/lib/verification/sourcify.js +227 -0
  285. package/dist/lib/verification/sourcify.js.map +1 -0
  286. package/eslint.config.js +48 -0
  287. package/examples/jobs/guards-v1.yaml +17 -0
  288. package/examples/jobs/sequence-seq-0001-patch.yaml +59 -0
  289. package/examples/jobs/sequence-v1.yaml +59 -0
  290. package/examples/templates/sequence-factory-v1.yaml +56 -0
  291. package/jest.config.js +25 -0
  292. package/package.json +68 -0
  293. package/src/cli.ts +17 -0
  294. package/src/commands/common.ts +61 -0
  295. package/src/commands/dry.ts +208 -0
  296. package/src/commands/etherscan.ts +360 -0
  297. package/src/commands/index.ts +5 -0
  298. package/src/commands/list.ts +249 -0
  299. package/src/commands/run.ts +136 -0
  300. package/src/commands/utils.ts +52 -0
  301. package/src/index.ts +67 -0
  302. package/src/lib/__tests__/deployer-events.spec.ts +338 -0
  303. package/src/lib/__tests__/deployer.spec.ts +1204 -0
  304. package/src/lib/__tests__/network-utils.spec.ts +181 -0
  305. package/src/lib/artifacts/__tests__/fixtures/contract1.json +19 -0
  306. package/src/lib/artifacts/__tests__/fixtures/contract2.json +19 -0
  307. package/src/lib/artifacts/__tests__/fixtures/duplicate-name.json +19 -0
  308. package/src/lib/artifacts/__tests__/fixtures/nested/nested-contract.json +18 -0
  309. package/src/lib/artifacts/__tests__/fixtures/not-an-artifact.json +8 -0
  310. package/src/lib/artifacts/__tests__/fixtures/readme.txt +2 -0
  311. package/src/lib/contracts/__tests__/repository.spec.ts +344 -0
  312. package/src/lib/contracts/repository.ts +313 -0
  313. package/src/lib/core/__tests__/engine.spec.ts +1514 -0
  314. package/src/lib/core/__tests__/graph.spec.ts +125 -0
  315. package/src/lib/core/__tests__/json-integration.spec.ts +360 -0
  316. package/src/lib/core/__tests__/loader.spec.ts +334 -0
  317. package/src/lib/core/__tests__/multi-platform-verification.spec.ts +406 -0
  318. package/src/lib/core/__tests__/resolver.spec.ts +1693 -0
  319. package/src/lib/core/__tests__/static-action.spec.ts +172 -0
  320. package/src/lib/core/context.ts +127 -0
  321. package/src/lib/core/engine.ts +1531 -0
  322. package/src/lib/core/graph.ts +252 -0
  323. package/src/lib/core/loader.ts +263 -0
  324. package/src/lib/core/resolver.ts +498 -0
  325. package/src/lib/deployer.ts +768 -0
  326. package/src/lib/events/__tests__/event-system.spec.ts +343 -0
  327. package/src/lib/events/cli-adapter.ts +325 -0
  328. package/src/lib/events/emitter.ts +62 -0
  329. package/src/lib/events/index.ts +3 -0
  330. package/src/lib/events/types.ts +469 -0
  331. package/src/lib/index.ts +14 -0
  332. package/src/lib/network-loader.ts +59 -0
  333. package/src/lib/network-utils.ts +64 -0
  334. package/src/lib/parsers/__tests__/buildinfo.spec.ts +122 -0
  335. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-bytecode-buildinfo.json +62 -0
  336. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-json.txt +2 -0
  337. package/src/lib/parsers/__tests__/fixtures/buildinfo/multi-contract-buildinfo.json +89 -0
  338. package/src/lib/parsers/__tests__/fixtures/buildinfo/no-contracts-buildinfo.json +17 -0
  339. package/src/lib/parsers/__tests__/fixtures/buildinfo/simple-buildinfo.json +63 -0
  340. package/src/lib/parsers/__tests__/fixtures/buildinfo/wrong-format.json +4 -0
  341. package/src/lib/parsers/__tests__/job.spec.ts +335 -0
  342. package/src/lib/parsers/__tests__/template.spec.ts +111 -0
  343. package/src/lib/parsers/artifact/__tests__/artifact.spec.ts +117 -0
  344. package/src/lib/parsers/artifact/__tests__/fixtures/empty-bytecode.json +5 -0
  345. package/src/lib/parsers/artifact/__tests__/fixtures/hardhat-artifact.json +67 -0
  346. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-bytecode.json +5 -0
  347. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-json.txt +11 -0
  348. package/src/lib/parsers/artifact/__tests__/fixtures/minimal-artifact.json +5 -0
  349. package/src/lib/parsers/artifact/__tests__/fixtures/missing-abi.json +4 -0
  350. package/src/lib/parsers/artifact/__tests__/fixtures/missing-bytecode.json +11 -0
  351. package/src/lib/parsers/artifact/__tests__/fixtures/missing-contract-name.json +11 -0
  352. package/src/lib/parsers/artifact/__tests__/fixtures/simple-artifact.json +40 -0
  353. package/src/lib/parsers/artifact/__tests__/fixtures/wrong-types.json +7 -0
  354. package/src/lib/parsers/artifact/foundry-1.2.ts +72 -0
  355. package/src/lib/parsers/artifact/index.ts +27 -0
  356. package/src/lib/parsers/artifact/types.ts +9 -0
  357. package/src/lib/parsers/buildinfo.ts +127 -0
  358. package/src/lib/parsers/constants.ts +56 -0
  359. package/src/lib/parsers/index.ts +5 -0
  360. package/src/lib/parsers/job.ts +101 -0
  361. package/src/lib/parsers/template.ts +131 -0
  362. package/src/lib/std/templates/assured-deployment.yaml +45 -0
  363. package/src/lib/std/templates/erc-2470.yaml +67 -0
  364. package/src/lib/std/templates/min-balance.yaml +32 -0
  365. package/src/lib/std/templates/nano-universal-deployer.yaml +59 -0
  366. package/src/lib/std/templates/raw-erc-2470.yaml +59 -0
  367. package/src/lib/std/templates/raw-nano-universal-deployer.yaml +51 -0
  368. package/src/lib/std/templates/raw-sequence-universal-deployer-2.yaml +48 -0
  369. package/src/lib/std/templates/sequence-universal-deployer-2.yaml +57 -0
  370. package/src/lib/types/__tests__/json-request-action.spec.ts +243 -0
  371. package/src/lib/types/__tests__/read-json-value.spec.ts +264 -0
  372. package/src/lib/types/actions.ts +127 -0
  373. package/src/lib/types/artifacts.ts +21 -0
  374. package/src/lib/types/buildinfo.ts +116 -0
  375. package/src/lib/types/conditions.ts +50 -0
  376. package/src/lib/types/contracts.ts +23 -0
  377. package/src/lib/types/definitions.ts +68 -0
  378. package/src/lib/types/index.ts +8 -0
  379. package/src/lib/types/network.ts +22 -0
  380. package/src/lib/types/project.ts +9 -0
  381. package/src/lib/types/task.ts +9 -0
  382. package/src/lib/types/values.ts +116 -0
  383. package/src/lib/utils/validation.ts +116 -0
  384. package/src/lib/validation/contract-references.ts +210 -0
  385. package/src/lib/validation/index.ts +1 -0
  386. package/src/lib/verification/__tests__/etherscan.spec.ts +710 -0
  387. package/src/lib/verification/__tests__/sourcify.spec.ts +288 -0
  388. package/src/lib/verification/etherscan.ts +546 -0
  389. package/src/lib/verification/sourcify.ts +248 -0
  390. package/test_validation/artifacts/TestContract.json +9 -0
  391. package/test_validation/jobs/test-missing.yaml +16 -0
  392. package/test_validation/networks.yaml +3 -0
  393. package/tsconfig.json +36 -0
@@ -0,0 +1,343 @@
1
+ import { DeploymentEventEmitter, CLIEventAdapter } from '../index'
2
+ import { DeploymentEvent } from '../types'
3
+
4
+ describe('Event System', () => {
5
+ let eventEmitter: DeploymentEventEmitter
6
+ let cliAdapter: CLIEventAdapter
7
+ let consoleLogSpy: jest.SpyInstance
8
+ let consoleErrorSpy: jest.SpyInstance
9
+ let consoleWarnSpy: jest.SpyInstance
10
+
11
+ beforeEach(() => {
12
+ eventEmitter = new DeploymentEventEmitter()
13
+ cliAdapter = new CLIEventAdapter(eventEmitter, 3)
14
+
15
+ // Mock console methods
16
+ consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => {})
17
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
18
+ consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
19
+ })
20
+
21
+ afterEach(() => {
22
+ cliAdapter.destroy()
23
+ consoleLogSpy.mockRestore()
24
+ consoleErrorSpy.mockRestore()
25
+ consoleWarnSpy.mockRestore()
26
+ })
27
+
28
+ describe('DeploymentEventEmitter', () => {
29
+ it('should emit events with automatic timestamp', () => {
30
+ const eventHandler = jest.fn()
31
+ eventEmitter.onAnyEvent(eventHandler)
32
+
33
+ eventEmitter.emitEvent({
34
+ type: 'deployment_started',
35
+ level: 'info',
36
+ data: {
37
+ projectRoot: '/test/project'
38
+ }
39
+ })
40
+
41
+ expect(eventHandler).toHaveBeenCalledWith(
42
+ expect.objectContaining({
43
+ type: 'deployment_started',
44
+ level: 'info',
45
+ data: {
46
+ projectRoot: '/test/project'
47
+ },
48
+ timestamp: expect.any(Date)
49
+ })
50
+ )
51
+ })
52
+
53
+ it('should emit on both specific event type and general event channel', () => {
54
+ const specificHandler = jest.fn()
55
+ const generalHandler = jest.fn()
56
+
57
+ eventEmitter.onEvent('job_started', specificHandler)
58
+ eventEmitter.onAnyEvent(generalHandler)
59
+
60
+ eventEmitter.emitEvent({
61
+ type: 'job_started',
62
+ level: 'info',
63
+ data: {
64
+ jobName: 'test-job',
65
+ jobVersion: '1.0.0',
66
+ networkName: 'localhost',
67
+ chainId: 1337
68
+ }
69
+ })
70
+
71
+ expect(specificHandler).toHaveBeenCalledTimes(1)
72
+ expect(generalHandler).toHaveBeenCalledTimes(1)
73
+ })
74
+
75
+ it('should handle events without data property', () => {
76
+ const eventHandler = jest.fn()
77
+ eventEmitter.onAnyEvent(eventHandler)
78
+
79
+ eventEmitter.emitEvent({
80
+ type: 'deployment_completed',
81
+ level: 'info'
82
+ })
83
+
84
+ expect(eventHandler).toHaveBeenCalledWith(
85
+ expect.objectContaining({
86
+ type: 'deployment_completed',
87
+ level: 'info',
88
+ timestamp: expect.any(Date)
89
+ })
90
+ )
91
+ })
92
+ })
93
+
94
+ describe('CLIEventAdapter', () => {
95
+ it('should output deployment started event', () => {
96
+ eventEmitter.emitEvent({
97
+ type: 'deployment_started',
98
+ level: 'info',
99
+ data: {
100
+ projectRoot: '/test/project'
101
+ }
102
+ })
103
+
104
+ expect(consoleLogSpy).toHaveBeenCalledWith(
105
+ expect.stringContaining('CATAPULT: STARTING DEPLOYMENT RUN')
106
+ )
107
+ })
108
+
109
+ it('should output project loading events', () => {
110
+ eventEmitter.emitEvent({
111
+ type: 'project_loading_started',
112
+ level: 'info',
113
+ data: {
114
+ projectRoot: '/test/project'
115
+ }
116
+ })
117
+
118
+ eventEmitter.emitEvent({
119
+ type: 'project_loaded',
120
+ level: 'info',
121
+ data: {
122
+ jobCount: 3,
123
+ templateCount: 5
124
+ }
125
+ })
126
+
127
+ expect(consoleLogSpy).toHaveBeenCalledWith(
128
+ expect.stringContaining('1. Loading project from: /test/project')
129
+ )
130
+ expect(consoleLogSpy).toHaveBeenCalledWith(
131
+ expect.stringContaining('Loaded 3 jobs, 5 templates, and registered artifacts.')
132
+ )
133
+ })
134
+
135
+ it('should output execution plan', () => {
136
+ eventEmitter.emitEvent({
137
+ type: 'execution_plan',
138
+ level: 'info',
139
+ data: {
140
+ targetNetworks: [
141
+ { name: 'localhost', chainId: 1337 },
142
+ { name: 'sepolia', chainId: 11155111 }
143
+ ],
144
+ jobExecutionOrder: ['deploy-factory', 'deploy-proxy']
145
+ }
146
+ })
147
+
148
+ expect(consoleLogSpy).toHaveBeenCalledWith(
149
+ expect.stringContaining('2. Execution Plan')
150
+ )
151
+ expect(consoleLogSpy).toHaveBeenCalledWith(
152
+ expect.stringContaining('Target Networks: localhost (ChainID: 1337), sepolia (ChainID: 11155111)')
153
+ )
154
+ expect(consoleLogSpy).toHaveBeenCalledWith(
155
+ expect.stringContaining('Job Execution Order: deploy-factory -> deploy-proxy')
156
+ )
157
+ })
158
+
159
+ it('should output job execution events', () => {
160
+ eventEmitter.emitEvent({
161
+ type: 'job_started',
162
+ level: 'info',
163
+ data: {
164
+ jobName: 'test-job',
165
+ jobVersion: '1.0.0',
166
+ networkName: 'localhost',
167
+ chainId: 1337
168
+ }
169
+ })
170
+
171
+ eventEmitter.emitEvent({
172
+ type: 'job_completed',
173
+ level: 'info',
174
+ data: {
175
+ jobName: 'test-job',
176
+ networkName: 'localhost',
177
+ chainId: 1337
178
+ }
179
+ })
180
+
181
+ expect(consoleLogSpy).toHaveBeenCalledWith(
182
+ expect.stringContaining('šŸš€ Starting job: test-job (v1.0.0)')
183
+ )
184
+ expect(consoleLogSpy).toHaveBeenCalledWith(
185
+ expect.stringContaining('āœ… Job "test-job" completed successfully')
186
+ )
187
+ })
188
+
189
+ it('should output transaction events', () => {
190
+ eventEmitter.emitEvent({
191
+ type: 'transaction_sent',
192
+ level: 'info',
193
+ data: {
194
+ to: '0x1234567890123456789012345678901234567890',
195
+ value: '1000000000000000000',
196
+ dataPreview: '0x1234567890abcdef',
197
+ txHash: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890'
198
+ }
199
+ })
200
+
201
+ eventEmitter.emitEvent({
202
+ type: 'transaction_confirmed',
203
+ level: 'info',
204
+ data: {
205
+ txHash: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890',
206
+ blockNumber: 12345
207
+ }
208
+ })
209
+
210
+ expect(consoleLogSpy).toHaveBeenCalledWith(
211
+ expect.stringContaining('to: 0x1234567890123456789012345678901234567890')
212
+ )
213
+ expect(consoleLogSpy).toHaveBeenCalledWith(
214
+ expect.stringContaining('tx hash: 0xabcdef')
215
+ )
216
+ expect(consoleLogSpy).toHaveBeenCalledWith(
217
+ expect.stringContaining('tx confirmed in block: 12345')
218
+ )
219
+ })
220
+
221
+ it('should output error events', () => {
222
+ eventEmitter.emitEvent({
223
+ type: 'deployment_failed',
224
+ level: 'error',
225
+ data: {
226
+ error: 'Test error message',
227
+ stack: 'Error stack trace'
228
+ }
229
+ })
230
+
231
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
232
+ expect.stringContaining('šŸ’„ DEPLOYMENT FAILED!')
233
+ )
234
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
235
+ expect.stringContaining('Error stack trace')
236
+ )
237
+ })
238
+
239
+ it('should output warning events', () => {
240
+ eventEmitter.emitEvent({
241
+ type: 'duplicate_artifact_warning',
242
+ level: 'warn',
243
+ data: {
244
+ contractName: 'TestContract',
245
+ path: '/path/to/artifact.json'
246
+ }
247
+ })
248
+
249
+ eventEmitter.emitEvent({
250
+ type: 'missing_network_config_warning',
251
+ level: 'warn',
252
+ data: {
253
+ missingChainIds: [1, 137]
254
+ }
255
+ })
256
+
257
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
258
+ expect.stringContaining('Duplicate artifact contractName found: "TestContract"')
259
+ )
260
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
261
+ expect.stringContaining('Could not find network configurations for specified chain IDs: 1, 137')
262
+ )
263
+ })
264
+
265
+ it('should handle unknown event types gracefully', () => {
266
+ const unknownEvent = {
267
+ type: 'unknown_event_type',
268
+ level: 'info',
269
+ timestamp: new Date(),
270
+ data: { test: 'data' }
271
+ } as any
272
+
273
+ // Manually emit to test fallback handling
274
+ eventEmitter.emit('event', unknownEvent)
275
+
276
+ // At default verbosity (0), unknown events are suppressed.
277
+ // Increase verbosity to 3 to enable concise unknown-event logging.
278
+ cliAdapter.setVerbosity(3)
279
+
280
+ // Re-emit under high verbosity to trigger default handler logging path
281
+ eventEmitter.emit('event', unknownEvent)
282
+
283
+ // Under verbosity 3, unknown events only log a concise line if data.message exists.
284
+ // Since our unknown event has no "data.message", no console.log call is expected.
285
+ expect(consoleLogSpy).not.toHaveBeenCalled()
286
+ })
287
+ })
288
+
289
+ describe('Event Integration', () => {
290
+ it('should maintain type safety for event data', () => {
291
+ const eventHandler = jest.fn()
292
+ eventEmitter.onEvent('job_started', eventHandler)
293
+
294
+ eventEmitter.emitEvent({
295
+ type: 'job_started',
296
+ level: 'info',
297
+ data: {
298
+ jobName: 'test-job',
299
+ jobVersion: '1.0.0',
300
+ networkName: 'localhost',
301
+ chainId: 1337
302
+ }
303
+ })
304
+
305
+ const receivedEvent = eventHandler.mock.calls[0][0]
306
+ expect(receivedEvent.data.jobName).toBe('test-job')
307
+ expect(receivedEvent.data.chainId).toBe(1337)
308
+ })
309
+
310
+ it('should support multiple listeners for the same event', () => {
311
+ const handler1 = jest.fn()
312
+ const handler2 = jest.fn()
313
+
314
+ eventEmitter.onEvent('deployment_completed', handler1)
315
+ eventEmitter.onEvent('deployment_completed', handler2)
316
+
317
+ eventEmitter.emitEvent({
318
+ type: 'deployment_completed',
319
+ level: 'info'
320
+ })
321
+
322
+ expect(handler1).toHaveBeenCalledTimes(1)
323
+ expect(handler2).toHaveBeenCalledTimes(1)
324
+ })
325
+
326
+ it('should remove event listeners correctly', () => {
327
+ const handler = jest.fn()
328
+
329
+ eventEmitter.onEvent('deployment_started', handler)
330
+ eventEmitter.offEvent('deployment_started', handler)
331
+
332
+ eventEmitter.emitEvent({
333
+ type: 'deployment_started',
334
+ level: 'info',
335
+ data: {
336
+ projectRoot: '/test/project'
337
+ }
338
+ })
339
+
340
+ expect(handler).not.toHaveBeenCalled()
341
+ })
342
+ })
343
+ })
@@ -0,0 +1,325 @@
1
+ import chalk from 'chalk'
2
+ import { DeploymentEvent } from './types'
3
+ import { DeploymentEventEmitter } from './emitter'
4
+
5
+ /**
6
+ * Verbosity levels for filtering console output:
7
+ * 0 (default): Critical info only - errors, warnings, main deployment steps
8
+ * 1 (-v): Add transaction details and verification steps
9
+ * 2 (-vv): Add action details and file operations
10
+ * 3 (-vvv): Full debug - show everything including template transitions
11
+ */
12
+ export type VerbosityLevel = 0 | 1 | 2 | 3
13
+
14
+ /**
15
+ * CLI adapter that converts structured deployment events into
16
+ * formatted console output using chalk for colors.
17
+ */
18
+ export class CLIEventAdapter {
19
+ private emitter: DeploymentEventEmitter
20
+ private verbosity: VerbosityLevel
21
+
22
+ constructor(emitter: DeploymentEventEmitter, verbosity: VerbosityLevel = 0) {
23
+ this.emitter = emitter
24
+ this.verbosity = verbosity
25
+ this.setupListeners()
26
+ }
27
+
28
+ /**
29
+ * Updates the verbosity level for this adapter.
30
+ */
31
+ setVerbosity(verbosity: VerbosityLevel): void {
32
+ this.verbosity = verbosity
33
+ }
34
+
35
+
36
+
37
+ private setupListeners(): void {
38
+ this.emitter.onAnyEvent((event) => {
39
+ this.handleEvent(event)
40
+ })
41
+ }
42
+
43
+ /**
44
+ * Determines the minimum verbosity level required to show an event.
45
+ */
46
+ private getEventVerbosityLevel(eventType: string): VerbosityLevel {
47
+ // Level 0 (default): Critical info only
48
+ const level0Events = new Set([
49
+ 'deployment_started', 'deployment_completed', 'deployment_failed',
50
+ 'job_started', 'job_completed', 'job_skipped', 'job_execution_failed',
51
+ 'network_started',
52
+ 'duplicate_artifact_warning', 'missing_network_config_warning',
53
+ 'unhandled_rejection', 'uncaught_exception', 'cli_error',
54
+ 'verification_failed'
55
+ ])
56
+
57
+ // Level 1 (-v): Add transaction details and verification
58
+ const level1Events = new Set([
59
+ 'project_loading_started', 'project_loaded', 'execution_plan',
60
+ 'transaction_sent', 'transaction_confirmed',
61
+ 'contract_created',
62
+ 'verification_started', 'verification_submitted', 'verification_completed',
63
+ 'output_writing_started', 'output_file_written', 'no_outputs',
64
+ 'run_summary'
65
+ ])
66
+
67
+ // Level 2 (-vv): Add action details and operations
68
+ const level2Events = new Set([
69
+ 'action_started', 'action_skipped',
70
+ 'template_setup_started', 'template_setup_completed', 'template_setup_skipped', 'template_skipped'
71
+ ])
72
+
73
+ // Level 3 (-vvv): Full debug - everything else
74
+ const level3Events = new Set([
75
+ 'template_entered', 'template_exited',
76
+ 'primitive_action', 'output_stored',
77
+ 'debug_info', 'action_failed', 'action_info', 'action_completed'
78
+ ])
79
+
80
+ if (level0Events.has(eventType)) return 0
81
+ if (level1Events.has(eventType)) return 1
82
+ if (level2Events.has(eventType)) return 2
83
+ if (level3Events.has(eventType)) return 3
84
+
85
+ // Default to level 3 for any new events we haven't categorized
86
+ return 3
87
+ }
88
+
89
+ private handleEvent(event: DeploymentEvent): void {
90
+ // Filter events based on verbosity level
91
+ const requiredLevel = this.getEventVerbosityLevel(event.type)
92
+ if (this.verbosity < requiredLevel) {
93
+ return
94
+ }
95
+ switch (event.type) {
96
+ case 'deployment_started':
97
+ console.log(chalk.bold.inverse(' CATAPULT: STARTING DEPLOYMENT RUN '))
98
+ break
99
+
100
+ case 'project_loading_started':
101
+ console.log(chalk.blue(`\n1. Loading project from: ${event.data.projectRoot}`))
102
+ break
103
+
104
+ case 'project_loaded':
105
+ console.log(chalk.green(` - Loaded ${event.data.jobCount} jobs, ${event.data.templateCount} templates, and registered artifacts.`))
106
+ break
107
+
108
+ case 'execution_plan':
109
+ console.log(chalk.blue('\n2. Execution Plan'))
110
+ console.log(chalk.gray(` - Target Networks: ${event.data.targetNetworks.map(n => `${n.name} (ChainID: ${n.chainId})`).join(', ')}`))
111
+ console.log(chalk.gray(` - Job Execution Order: ${event.data.jobExecutionOrder.join(' -> ')}`))
112
+ break
113
+
114
+ case 'network_started':
115
+ console.log(chalk.cyan.bold(`\nNetwork: ${event.data.networkName} (ChainID: ${event.data.chainId})`))
116
+ break
117
+
118
+ case 'job_started':
119
+ console.log(chalk.cyan.bold(`\nšŸš€ Starting job: ${event.data.jobName} (v${event.data.jobVersion})`))
120
+ break
121
+
122
+ case 'job_completed':
123
+ console.log(chalk.green.bold(`āœ… Job "${event.data.jobName}" completed successfully.`))
124
+ break
125
+
126
+ case 'job_skipped':
127
+ console.log(chalk.yellow(` Skipping job "${event.data.jobName}" on network "${event.data.networkName}" due to configuration.`))
128
+ break
129
+
130
+ case 'action_started':
131
+ console.log(chalk.blue(` - Executing: ${event.data.actionName}`))
132
+ break
133
+
134
+ case 'action_skipped':
135
+ console.log(chalk.yellow(` ↪ Skipping "${event.data.actionName}": ${event.data.reason}`))
136
+ break
137
+
138
+ case 'template_entered':
139
+ console.log(chalk.magenta(` -> Entering template: ${event.data.templateName}`))
140
+ break
141
+
142
+ case 'template_exited':
143
+ console.log(chalk.magenta(` <- Exiting template: ${event.data.templateName}`))
144
+ break
145
+
146
+ case 'template_setup_started':
147
+ console.log(chalk.magenta(` -> Running setup for template: ${event.data.templateName}`))
148
+ break
149
+
150
+ case 'template_setup_completed':
151
+ console.log(chalk.magenta(` <- Finished setup for template: ${event.data.templateName}`))
152
+ break
153
+
154
+ case 'template_setup_skipped':
155
+ // Don't output anything - this is internal and not user-facing
156
+ break
157
+
158
+ case 'template_skipped':
159
+ console.log(chalk.yellow(` ↪ Skipping actions in template "${event.data.templateName}" due to met condition.`))
160
+ break
161
+
162
+ case 'primitive_action':
163
+ console.log(chalk.gray(` Executing primitive: ${event.data.actionType}`))
164
+ break
165
+
166
+ case 'transaction_sent':
167
+ console.log(chalk.gray(` to: ${event.data.to}, value: ${event.data.value}, data: ${event.data.dataPreview}...`))
168
+ console.log(chalk.gray(` tx hash: ${event.data.txHash}`))
169
+ break
170
+
171
+ case 'transaction_confirmed':
172
+ console.log(chalk.gray(` tx confirmed in block: ${event.data.blockNumber}`))
173
+ break
174
+
175
+ case 'output_stored':
176
+ console.log(chalk.gray(` Stored output: ${event.data.outputKey} = ${event.data.value}`))
177
+ break
178
+
179
+ case 'output_writing_started':
180
+ console.log(chalk.blue('\n4. Writing output files...'))
181
+ break
182
+
183
+ case 'output_file_written':
184
+ console.log(chalk.green(` - Wrote: ${event.data.relativePath}`))
185
+ break
186
+
187
+ case 'no_outputs':
188
+ console.log(chalk.yellow('\nNo successful job executions to write to output.'))
189
+ break
190
+
191
+ case 'deployment_completed':
192
+ // Print a compact, high-signal run summary. The Deployer will have emitted
193
+ // preceding info, so we only render a final banner here. Detailed counts
194
+ // are printed via a separate 'run_summary' event.
195
+ console.log(chalk.bold.inverse('\n CATAPULT: DEPLOYMENT RUN COMPLETED SUCCESSFULLY '))
196
+ break
197
+
198
+ case 'deployment_failed':
199
+ console.error(chalk.red.bold('\nšŸ’„ DEPLOYMENT FAILED!'))
200
+ if (event.data.stack) {
201
+ console.error(chalk.red(event.data.stack))
202
+ } else {
203
+ console.error(chalk.red(event.data.error))
204
+ }
205
+ break
206
+
207
+ case 'duplicate_artifact_warning':
208
+ console.warn(`Warning: Duplicate artifact contractName found: "${event.data.contractName}". Name-based lookup disabled - use hash or path references instead.`)
209
+ break
210
+
211
+ case 'missing_network_config_warning':
212
+ console.warn(chalk.yellow(`Warning: Could not find network configurations for specified chain IDs: ${event.data.missingChainIds.join(', ')}`))
213
+ break
214
+
215
+ case 'unhandled_rejection':
216
+ console.error(chalk.red('Unhandled Rejection:'), event.data.error, chalk.red('origin:'), event.data.origin)
217
+ break
218
+
219
+ case 'uncaught_exception':
220
+ console.error(chalk.red('Uncaught Exception:'), event.data.error)
221
+ break
222
+
223
+ case 'cli_error':
224
+ console.error(chalk.red('Error:'), event.data.message)
225
+ break
226
+
227
+ case 'verification_started':
228
+ console.log(chalk.gray(` šŸ” Verifying contract on ${event.data.platform} (${event.data.networkName})...`))
229
+ break
230
+
231
+ case 'verification_submitted':
232
+ if (event.data.guid && event.data.guid !== 'N/A') {
233
+ console.log(chalk.gray(` šŸ“ Verification submitted to ${event.data.platform} (GUID: ${event.data.guid})`))
234
+ }
235
+ break
236
+
237
+ case 'verification_completed':
238
+ if (event.data.message.includes('already verified')) {
239
+ console.log(chalk.yellow(` āœ“ Already verified on ${event.data.platform}`))
240
+ } else {
241
+ console.log(chalk.green(` āœ… ${event.data.message} on ${event.data.platform}`))
242
+ }
243
+ break
244
+
245
+ case 'verification_failed':
246
+ console.log(chalk.red(` āŒ Verification failed on ${event.data.platform}: ${event.data.error}`))
247
+ break
248
+
249
+ case 'verification_retry':
250
+ // Keep short to reduce noise
251
+ console.log(chalk.gray(` Verification retry ${event.data.attempt}/${event.data.maxRetries}: ${event.data.error}`))
252
+ break
253
+ case 'contract_created':
254
+ console.log(chalk.gray(` contract: ${event.data.contractAddress}`))
255
+ break
256
+
257
+ case 'context_disposal_warning':
258
+ console.warn(chalk.yellow(`Warning: context cleanup issue for job "${event.data.jobName}" on ${event.data.networkName}: ${event.data.error}`))
259
+ break
260
+
261
+ case 'deprecated_jobs_skipped':
262
+ if (Array.isArray(event.data.jobs) && event.data.jobs.length > 0) {
263
+ const names = event.data.jobs.map((j: any) => typeof j === 'string' ? j : j.name).filter(Boolean)
264
+ console.log(chalk.yellow(`Skipping deprecated jobs (not requested): ${names.join(', ')}`))
265
+ }
266
+ break
267
+
268
+ case 'run_summary':
269
+ // Rich end-of-run summary
270
+ console.log(chalk.blue('\n5. Summary'))
271
+ console.log(chalk.gray(` Networks: ${event.data.networkCount}, Jobs: ${event.data.jobCount}`))
272
+ console.log(chalk.green(` āœ“ Success: ${event.data.successCount}`))
273
+ if (event.data.skippedCount > 0) console.log(chalk.yellow(` ↪ Skipped: ${event.data.skippedCount}`))
274
+ if (event.data.failedCount > 0) console.log(chalk.red(` āœ— Failed: ${event.data.failedCount}`))
275
+ if (Array.isArray(event.data.keyContracts) && event.data.keyContracts.length > 0) {
276
+ console.log(chalk.gray(' Key contracts:'))
277
+ for (const c of event.data.keyContracts) {
278
+ console.log(chalk.gray(` - ${c.job}.${c.action}: ${c.address}`))
279
+ }
280
+ }
281
+ break
282
+
283
+ case 'job_execution_failed':
284
+ console.error(chalk.red.bold(`āŒ Job "${event.data.jobName}" failed on ${event.data.networkName} (Chain ID: ${event.data.chainId})`))
285
+ console.error(chalk.red(` Error: ${event.data.error}`))
286
+ break
287
+
288
+ case 'action_completed':
289
+ console.log(chalk.green(` āœ… ${event.data.result}`))
290
+ break
291
+
292
+ case 'action_failed':
293
+ console.log(chalk.red(` āŒ ${event.data.message}`))
294
+ break
295
+
296
+ case 'action_info':
297
+ console.log(chalk.gray(` ā„¹ļø ${event.data.message}`))
298
+ break
299
+
300
+ case 'debug_info':
301
+ console.log(chalk.gray(` [DEBUG] ${event.data.message}`))
302
+ break
303
+
304
+ default:
305
+ // Suppress raw debug dumps in CLI output; only show a concise line at highest verbosity
306
+ if (this.verbosity >= 3) {
307
+ const level = (event as any).level?.toUpperCase?.() || 'DEBUG'
308
+ const type = (event as any).type || 'event'
309
+ const msg = (event as any).data?.message
310
+ if (msg) {
311
+ console.log(chalk.gray(` [${level}] ${type}: ${msg}`))
312
+ }
313
+ // Otherwise, remain silent to avoid noisy/broken logs
314
+ }
315
+ break
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Stop listening to events (cleanup method).
321
+ */
322
+ public destroy(): void {
323
+ this.emitter.removeAllListeners()
324
+ }
325
+ }