@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,249 @@
1
+ import { Command } from 'commander'
2
+ import chalk from 'chalk'
3
+ import * as path from 'path'
4
+ import { loadProject, projectOption, noStdOption, verbosityOption } from './common'
5
+ import { loadNetworks } from '../lib/network-loader'
6
+ import { setVerbosity } from '../index'
7
+
8
+ interface ListOptions {
9
+ project: string
10
+ std: boolean
11
+ verbose: number
12
+ }
13
+
14
+ interface NetworksListOptions {
15
+ project: string
16
+ verbose: number
17
+ onlyTestnets?: boolean
18
+ onlyNonTestnets?: boolean
19
+ }
20
+
21
+ export function makeListCommand(): Command {
22
+ const list = new Command('list')
23
+ .description('List project resources like jobs, contracts, and networks')
24
+
25
+ const listJobs = new Command('jobs')
26
+ .description('List all available jobs in the project')
27
+ projectOption(listJobs)
28
+ noStdOption(listJobs)
29
+ verbosityOption(listJobs)
30
+ listJobs.action(async (options: ListOptions) => {
31
+ try {
32
+ // Set verbosity level for logging
33
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
34
+ const loader = await loadProject(options.project, {
35
+ loadStdTemplates: options.std !== false
36
+ })
37
+ console.log(chalk.bold.underline('Available Jobs:'))
38
+ if (loader.jobs.size === 0) {
39
+ console.log(chalk.yellow('No jobs found in this project.'))
40
+ return
41
+ }
42
+ for (const job of loader.jobs.values()) {
43
+ const deprecatedMark = (job as { deprecated?: boolean }).deprecated ? ` ${chalk.yellow('(deprecated)')}` : ''
44
+ console.log(`- ${chalk.cyan(job.name)} (v${job.version})${deprecatedMark}`)
45
+ if (job.description) {
46
+ console.log(` ${chalk.gray(job.description)}`)
47
+ }
48
+ }
49
+ } catch (error) {
50
+ console.error(chalk.red('Error listing jobs:'), error instanceof Error ? error.message : String(error))
51
+ process.exit(1)
52
+ }
53
+ })
54
+
55
+ const listContracts = new Command('contracts')
56
+ .description('List all contracts found in the project')
57
+ projectOption(listContracts)
58
+ noStdOption(listContracts)
59
+ verbosityOption(listContracts)
60
+ listContracts.action(async (options: ListOptions) => {
61
+ try {
62
+ // Set verbosity level for logging
63
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
64
+ const loader = await loadProject(options.project, {
65
+ loadStdTemplates: options.std !== false
66
+ })
67
+ const contracts = loader.contractRepository.getAll()
68
+ const ambiguousRefs = loader.contractRepository.getAmbiguousReferences()
69
+
70
+ // Display contracts
71
+ console.log(chalk.bold.underline('Available Contracts:'))
72
+ if (contracts.length === 0) {
73
+ console.log(chalk.yellow('No contracts found in this project.'))
74
+ } else {
75
+ for (const contract of contracts) {
76
+ const name = contract.contractName || 'Unknown'
77
+ const source = contract.sourceName || 'Unknown'
78
+ console.log(`- ${chalk.cyan(name)} (${source})`)
79
+ console.log(` ${chalk.gray('Unique Hash:')} ${contract.uniqueHash}`)
80
+ if (contract.buildInfoId) {
81
+ console.log(` ${chalk.gray('Build Info ID:')} ${contract.buildInfoId}`)
82
+ }
83
+ console.log(` ${chalk.gray('Sources:')} ${Array.from(contract._sources).map(p => path.relative(options.project, p)).join(', ')}`)
84
+ }
85
+ }
86
+
87
+ // Display ambiguous references if any
88
+ if (ambiguousRefs.length > 0) {
89
+ console.log('\n' + chalk.bold.underline(chalk.yellow('Ambiguous References:')))
90
+ console.log(chalk.yellow('The following references point to multiple contracts:'))
91
+ for (const ref of ambiguousRefs) {
92
+ console.log(`- ${chalk.red(ref)}`)
93
+ }
94
+ console.log(chalk.yellow('Use the unique hash or a more specific path to reference these contracts.'))
95
+ }
96
+
97
+ if (contracts.length === 0) {
98
+ console.log('\n' + chalk.yellow('No contracts found in this project. Make sure you have artifact files or build-info files in your project.'))
99
+ }
100
+ } catch (error) {
101
+ console.error(chalk.red('Error listing contracts:'), error instanceof Error ? error.message : String(error))
102
+ process.exit(1)
103
+ }
104
+ })
105
+
106
+ const listTemplates = new Command('templates')
107
+ .description('List all available templates')
108
+ projectOption(listTemplates)
109
+ noStdOption(listTemplates)
110
+ verbosityOption(listTemplates)
111
+ listTemplates.action(async (options: ListOptions) => {
112
+ try {
113
+ // Set verbosity level for logging
114
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
115
+ const loader = await loadProject(options.project, {
116
+ loadStdTemplates: options.std !== false
117
+ })
118
+ console.log(chalk.bold.underline('Available Templates:'))
119
+ if (loader.templates.size === 0) {
120
+ console.log(chalk.yellow('No templates found.'))
121
+ return
122
+ }
123
+ for (const template of loader.templates.values()) {
124
+ console.log(`- ${chalk.cyan(template.name)}`)
125
+ if (template.description) {
126
+ console.log(` ${chalk.gray(template.description)}`)
127
+ }
128
+ }
129
+ } catch (error) {
130
+ console.error(chalk.red('Error listing templates:'), error instanceof Error ? error.message : String(error))
131
+ process.exit(1)
132
+ }
133
+ })
134
+
135
+ const listNetworks = new Command('networks')
136
+ .description('List all configured networks')
137
+ projectOption(listNetworks)
138
+ verbosityOption(listNetworks)
139
+ listNetworks.option('--only-testnets', 'Show only test networks')
140
+ listNetworks.option('--only-non-testnets', 'Show only non-test networks')
141
+ listNetworks.option('--simple', 'Output only network names, one per line')
142
+ listNetworks.option('--simple-chain-ids', 'Output only chain IDs, one per line')
143
+ listNetworks.action(async (options: NetworksListOptions & { simple?: boolean; simpleChainIds?: boolean }) => {
144
+ try {
145
+ // Set verbosity level for logging
146
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
147
+ const networks = await loadNetworks(options.project)
148
+
149
+ // Apply filtering if specified
150
+ let filteredNetworks = networks
151
+ if (options.onlyTestnets) {
152
+ filteredNetworks = networks.filter(network => network.testnet === true)
153
+ } else if (options.onlyNonTestnets) {
154
+ filteredNetworks = networks.filter(network => network.testnet !== true)
155
+ }
156
+
157
+ // Handle simple output formats
158
+ if (options.simple) {
159
+ if (filteredNetworks.length === 0) {
160
+ console.log('')
161
+ return
162
+ }
163
+ console.log(filteredNetworks.map(network => network.name).join('\n'))
164
+ return
165
+ }
166
+
167
+ if (options.simpleChainIds) {
168
+ if (filteredNetworks.length === 0) {
169
+ console.log('')
170
+ return
171
+ }
172
+ console.log(filteredNetworks.map(network => network.chainId.toString()).join('\n'))
173
+ return
174
+ }
175
+
176
+ // Default formatted output
177
+ console.log(chalk.bold.underline('Available Networks:'))
178
+ if (filteredNetworks.length === 0) {
179
+ if (options.onlyTestnets) {
180
+ console.log(chalk.yellow('No test networks configured.'))
181
+ } else if (options.onlyNonTestnets) {
182
+ console.log(chalk.yellow('No non-test networks configured.'))
183
+ } else {
184
+ console.log(chalk.yellow('No networks configured. Create a networks.yaml file in your project root.'))
185
+ }
186
+ return
187
+ }
188
+
189
+ for (const network of filteredNetworks) {
190
+ const testnetIndicator = network.testnet ? chalk.green('(testnet)') : ''
191
+ console.log(`- ${chalk.cyan(network.name)} (Chain ID: ${network.chainId}) ${testnetIndicator}`)
192
+ console.log(` ${chalk.gray(`RPC: ${network.rpcUrl}`)}`)
193
+ }
194
+ } catch (error) {
195
+ console.error(chalk.red('Error listing networks:'), error instanceof Error ? error.message : String(error))
196
+ process.exit(1)
197
+ }
198
+ })
199
+
200
+ // New: list constants
201
+ const listConstants = new Command('constants')
202
+ .description('List constants defined at top-level and per job')
203
+ projectOption(listConstants)
204
+ noStdOption(listConstants)
205
+ verbosityOption(listConstants)
206
+ listConstants.action(async (options: ListOptions) => {
207
+ try {
208
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
209
+ const loader = await loadProject(options.project, {
210
+ loadStdTemplates: options.std !== false
211
+ })
212
+ console.log(chalk.bold.underline('Top-level Constants:'))
213
+ if (loader.constants.size === 0) {
214
+ console.log(chalk.yellow('No top-level constants found.'))
215
+ } else {
216
+ for (const [key, value] of loader.constants.entries()) {
217
+ // Only display keys to avoid dumping large values
218
+ console.log(`- ${chalk.cyan(key)}${options.verbose ? ` = ${JSON.stringify(value)}` : ''}`)
219
+ }
220
+ }
221
+ console.log(chalk.bold.underline('\nJob-level Constants:'))
222
+ let anyJobConstants = false
223
+ for (const job of loader.jobs.values()) {
224
+ const constants = job.constants
225
+ if (constants && Object.keys(constants).length > 0) {
226
+ anyJobConstants = true
227
+ console.log(`- ${chalk.cyan(job.name)}:`)
228
+ for (const key of Object.keys(constants)) {
229
+ console.log(` • ${key}${options.verbose ? ` = ${JSON.stringify(constants[key])}` : ''}`)
230
+ }
231
+ }
232
+ }
233
+ if (!anyJobConstants) {
234
+ console.log(chalk.yellow('No job-level constants found.'))
235
+ }
236
+ } catch (error) {
237
+ console.error(chalk.red('Error listing constants:'), error instanceof Error ? error.message : String(error))
238
+ process.exit(1)
239
+ }
240
+ })
241
+
242
+ list.addCommand(listJobs)
243
+ list.addCommand(listContracts)
244
+ list.addCommand(listTemplates)
245
+ list.addCommand(listNetworks)
246
+ list.addCommand(listConstants)
247
+
248
+ return list
249
+ }
@@ -0,0 +1,136 @@
1
+ import { Command } from 'commander'
2
+ import { Deployer, DeployerOptions } from '../lib/deployer'
3
+ import { loadNetworks } from '../lib/network-loader'
4
+ import { detectNetworkFromRpc, isValidRpcUrl } from '../lib/network-utils'
5
+ import { deploymentEvents } from '../lib/events'
6
+ import { Network } from '../lib/types'
7
+ import { projectOption, dotenvOption, noStdOption, verbosityOption, loadDotenv } from './common'
8
+ import { setVerbosity } from '../index'
9
+
10
+ interface RunOptions {
11
+ project: string
12
+ privateKey?: string
13
+ network?: string[]
14
+ rpcUrl?: string
15
+ dotenv?: string
16
+ std: boolean
17
+ etherscanApiKey?: string
18
+ verbose: number
19
+ failEarly: boolean
20
+ noPostCheckConditions: boolean
21
+ flatOutput: boolean
22
+ summary: boolean
23
+ }
24
+
25
+ export function makeRunCommand(): Command {
26
+ const run = new Command('run')
27
+ .description('Run deployment jobs on specified networks')
28
+ .argument('[jobs...]', 'Specific job names or patterns to run (and their dependencies). Supports wildcards like "sequence/*" or "job?". If not provided, all jobs are run.')
29
+ .option('-k, --private-key <key>', 'Signer private key. Can also be set via PRIVATE_KEY env var.')
30
+ .option('-n, --network <chainIds...>', 'One or more network chain IDs to run on. If not provided, runs on all configured networks.')
31
+ .option('--rpc-url <url>', 'Custom RPC URL to run on. The system will automatically detect chainId and network information. This overrides networks.yaml configuration.')
32
+ .option('--etherscan-api-key <key>', 'Etherscan API key for contract verification. Can also be set via ETHERSCAN_API_KEY env var.')
33
+ .option('--fail-early', 'Stop execution as soon as any job fails. Default: false', false)
34
+ .option('--no-post-check-conditions', 'Skip post-execution check of skip conditions. Default: false (post-check enabled)', false)
35
+ .option('--flat-output', 'Write output files in a single flat directory instead of mirroring the jobs directory structure. Default: false', false)
36
+ .option('--no-summary', 'Hide final summary at the end of the run. Default: show', false)
37
+ .option('--run-deprecated', 'Allow running jobs marked as deprecated. By default deprecated jobs are skipped unless explicitly targeted.', false)
38
+
39
+ projectOption(run)
40
+ dotenvOption(run)
41
+ noStdOption(run)
42
+ verbosityOption(run)
43
+
44
+ run.action(async (jobs: string[], options: RunOptions) => {
45
+ try {
46
+ loadDotenv(options)
47
+
48
+ // Set verbosity level for logging
49
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
50
+
51
+ const privateKey: string | undefined = options.privateKey || process.env.PRIVATE_KEY
52
+ if (!privateKey && !options.rpcUrl) {
53
+ throw new Error('A private key must be provided via the --private-key option or the PRIVATE_KEY environment variable, or an --rpc-url must be specified to attempt an implicit sender.')
54
+ }
55
+
56
+ const etherscanApiKey = options.etherscanApiKey || process.env.ETHERSCAN_API_KEY
57
+
58
+ const projectRoot = options.project
59
+
60
+ // Load networks from YAML file
61
+ let networks = await loadNetworks(projectRoot)
62
+
63
+ // Handle custom RPC URL if provided
64
+ if (options.rpcUrl) {
65
+ // Custom RPC URL provided
66
+
67
+ // Validate RPC URL format
68
+ if (!isValidRpcUrl(options.rpcUrl)) {
69
+ throw new Error(`Invalid RPC URL format: ${options.rpcUrl}`)
70
+ }
71
+
72
+ try {
73
+ // Detect network information from RPC URL
74
+ const detectedNetwork = await detectNetworkFromRpc(options.rpcUrl)
75
+
76
+ // Create a complete network object
77
+ const customNetwork: Network = {
78
+ name: detectedNetwork.name || `custom-${detectedNetwork.chainId}`,
79
+ chainId: detectedNetwork.chainId!,
80
+ rpcUrl: options.rpcUrl,
81
+ // Optional fields with defaults
82
+ supports: detectedNetwork.supports || [],
83
+ gasLimit: detectedNetwork.gasLimit,
84
+ testnet: detectedNetwork.testnet
85
+ }
86
+
87
+ // Custom network created from RPC detection
88
+
89
+ // Replace networks array with just the custom network
90
+ networks = [customNetwork]
91
+ } catch (error) {
92
+ throw new Error(`Failed to detect network from RPC URL "${options.rpcUrl}": ${error instanceof Error ? error.message : String(error)}`)
93
+ }
94
+ }
95
+
96
+ if (networks.length === 0 && !options.rpcUrl) {
97
+ throw new Error('No networks configured. Please create a networks.yaml file in your project root or use --rpc-url to specify a custom network.')
98
+ }
99
+
100
+ const deployerOptions: DeployerOptions = {
101
+ projectRoot,
102
+ privateKey,
103
+ networks,
104
+ runJobs: jobs.length > 0 ? jobs : undefined,
105
+ runOnNetworks: options.network?.map(Number),
106
+ etherscanApiKey,
107
+ failEarly: options.failEarly,
108
+ noPostCheckConditions: options.noPostCheckConditions,
109
+ showSummary: options.summary !== false,
110
+ loaderOptions: {
111
+ loadStdTemplates: options.std !== false
112
+ },
113
+ flatOutput: options.flatOutput === true,
114
+ runDeprecated: (options as { runDeprecated?: boolean }).runDeprecated === true
115
+ } as DeployerOptions
116
+
117
+ const deployer = new Deployer(deployerOptions)
118
+ await deployer.run()
119
+
120
+ } catch (error) {
121
+ // The deployer emits its own rich error event, so we just log a generic one if something fails before that.
122
+ if (!(error instanceof Error && error.message.includes('deployment_failed'))) {
123
+ deploymentEvents.emitEvent({
124
+ type: 'cli_error',
125
+ level: 'error',
126
+ data: {
127
+ message: error instanceof Error ? error.message : String(error)
128
+ }
129
+ })
130
+ }
131
+ process.exit(1)
132
+ }
133
+ })
134
+
135
+ return run
136
+ }
@@ -0,0 +1,52 @@
1
+ import { Command } from 'commander'
2
+ import chalk from 'chalk'
3
+ import { projectOption, verbosityOption } from './common'
4
+ import { loadNetworks } from '../lib/network-loader'
5
+ import { setVerbosity } from '../index'
6
+
7
+ interface UtilsOptions {
8
+ project: string
9
+ verbose: number
10
+ }
11
+
12
+ export function makeUtilsCommand(): Command {
13
+ const utils = new Command('utils')
14
+ .description('Utility commands for project management')
15
+
16
+ const chainIdToName = new Command('chain-id-to-name')
17
+ .description('Convert a chain ID to network name')
18
+ projectOption(chainIdToName)
19
+ verbosityOption(chainIdToName)
20
+
21
+ chainIdToName.argument('<chain-id>', 'The chain ID to convert')
22
+ chainIdToName.action(async (chainId: string, options: UtilsOptions) => {
23
+ try {
24
+ // Set verbosity level for logging
25
+ setVerbosity(options.verbose as 0 | 1 | 2 | 3)
26
+
27
+ const chainIdNumber = parseInt(chainId, 10)
28
+ if (isNaN(chainIdNumber)) {
29
+ console.error(chalk.red('Invalid chain ID. Please provide a valid number.'))
30
+ process.exit(1)
31
+ }
32
+
33
+ const networks = await loadNetworks(options.project)
34
+
35
+ const network = networks.find(n => n.chainId === chainIdNumber)
36
+
37
+ if (network) {
38
+ console.log(network.name)
39
+ } else {
40
+ console.error(chalk.red(`No network found with chain ID ${chainIdNumber}`))
41
+ process.exit(1)
42
+ }
43
+ } catch (error) {
44
+ console.error(chalk.red('Error converting chain ID to network name:'), error instanceof Error ? error.message : String(error))
45
+ process.exit(1)
46
+ }
47
+ })
48
+
49
+ utils.addCommand(chainIdToName)
50
+
51
+ return utils
52
+ }
package/src/index.ts ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { program } from 'commander'
4
+ import chalk from 'chalk'
5
+ import { setupCommands } from './cli'
6
+ import packageJson from '../package.json'
7
+
8
+ import { deploymentEvents, CLIEventAdapter, VerbosityLevel } from './lib/events'
9
+
10
+ // Set up CLI event adapter to convert events to console output
11
+ const cliAdapter = new CLIEventAdapter(deploymentEvents)
12
+
13
+ // Export function to update CLI verbosity
14
+ export function setVerbosity(level: VerbosityLevel): void {
15
+ cliAdapter.setVerbosity(level)
16
+ }
17
+
18
+ // Setup global error handling
19
+ process.on('unhandledRejection', (reason, promise) => {
20
+ deploymentEvents.emitEvent({
21
+ type: 'unhandled_rejection',
22
+ level: 'error',
23
+ data: {
24
+ reason,
25
+ promise
26
+ }
27
+ })
28
+ process.exit(1)
29
+ })
30
+
31
+ process.on('uncaughtException', (error) => {
32
+ deploymentEvents.emitEvent({
33
+ type: 'uncaught_exception',
34
+ level: 'error',
35
+ data: {
36
+ error
37
+ }
38
+ })
39
+ process.exit(1)
40
+ })
41
+
42
+ async function main() {
43
+ try {
44
+ // Configure the main program
45
+ program
46
+ .name('catapult')
47
+ .description('Ethereum contract deployment CLI tool')
48
+ .version(packageJson.version)
49
+
50
+ // Setup all commands
51
+ setupCommands(program)
52
+
53
+ // Parse arguments
54
+ await program.parseAsync(process.argv)
55
+ } catch (error) {
56
+ deploymentEvents.emitEvent({
57
+ type: 'cli_error',
58
+ level: 'error',
59
+ data: {
60
+ message: error instanceof Error ? error.message : String(error)
61
+ }
62
+ })
63
+ process.exit(1)
64
+ }
65
+ }
66
+
67
+ main()