@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,125 @@
1
+ // src/lib/core/__tests__/graph.spec.ts
2
+ import * as path from 'path'
3
+ import { ProjectLoader } from '../loader'
4
+ import { DependencyGraph } from '../graph'
5
+ import { Job, Template } from '../../types'
6
+
7
+ describe('DependencyGraph', () => {
8
+ let loader: ProjectLoader
9
+
10
+ beforeAll(async () => {
11
+ // Load the real project structure from the examples directory
12
+ const projectRoot = path.resolve(__dirname, '../../../../examples')
13
+ loader = new ProjectLoader(projectRoot)
14
+ await loader.load()
15
+ })
16
+
17
+ it('should be created without errors for a valid project', () => {
18
+ expect(() => new DependencyGraph(loader.jobs, loader.templates)).not.toThrow()
19
+ })
20
+
21
+ it('should identify direct dependencies from `depends_on` field', () => {
22
+ const graph = new DependencyGraph(loader.jobs, loader.templates)
23
+ // guards-v1.yaml has `depends_on: ["sequence-v1"]`
24
+ const guardsDeps = graph.getDependencies('guards-v1')
25
+ expect(guardsDeps.has('sequence-v1')).toBe(true)
26
+ })
27
+
28
+ it('should identify dependencies from a template setup block (`job-completed`)', () => {
29
+ const jobs = new Map<string, Job>()
30
+ const templates = new Map<string, Template>()
31
+
32
+ templates.set('template-with-setup', {
33
+ name: 'template-with-setup',
34
+ actions: [],
35
+ setup: { skip_condition: [{ type: 'job-completed', arguments: { job: 'dependency-job' } }] },
36
+ })
37
+
38
+ jobs.set('job-A', { name: 'job-A', version: '1', actions: [{ name: 'a1', template: 'template-with-setup', arguments: {} }] })
39
+ jobs.set('dependency-job', { name: 'dependency-job', version: '1', actions: [] })
40
+
41
+ const graph = new DependencyGraph(jobs, templates)
42
+ const jobADeps = graph.getDependencies('job-A')
43
+ expect(jobADeps.has('dependency-job')).toBe(true)
44
+ })
45
+
46
+ it('should identify nested dependencies from templates calling templates in setup', () => {
47
+ // In our examples:
48
+ // job `sequence-v1` uses `sequence-universal-deployer-2`
49
+ // `sequence-universal-deployer-2`'s setup uses `nano-universal-deployer`
50
+ // `nano-universal-deployer`'s setup uses `min-balance` and `send-signed-transaction` (primitives)
51
+ // This test confirms the graph builder doesn't crash on this complexity.
52
+ // A more specific test would require mocking a deeper chain.
53
+ const graph = new DependencyGraph(loader.jobs, loader.templates);
54
+ const seqV1Deps = graph.getDependencies('sequence-v1');
55
+
56
+ // sequence-v1 itself has no job dependencies defined in its YAMLs, so this should be empty.
57
+ // This confirms our logic correctly distinguishes between template-setup-actions and job dependencies.
58
+ expect(seqV1Deps.size).toBe(0);
59
+ });
60
+
61
+ it('should correctly identify transitive dependencies', () => {
62
+ const graph = new DependencyGraph(loader.jobs, loader.templates)
63
+ // "sequence-v1-seq-0001-patch" -> "guards-v1" -> "sequence-v1"
64
+ const patchDeps = graph.getDependencies('sequence-v1-seq-0001-patch')
65
+ expect(patchDeps.has('guards-v1')).toBe(true)
66
+ expect(patchDeps.has('sequence-v1')).toBe(true) // Transitive dependency
67
+ expect(patchDeps.size).toBe(2) // depends on sequence-v1, and guards-v1
68
+ })
69
+
70
+ it('should produce a valid topological sort order', () => {
71
+ const graph = new DependencyGraph(loader.jobs, loader.templates)
72
+ const order = graph.getExecutionOrder()
73
+
74
+ // We can't know the exact order due to parallel possibilities,
75
+ // but we can verify that dependencies always come before their dependents.
76
+ const patchIndex = order.indexOf('sequence-v1-seq-0001-patch')
77
+ const guardsIndex = order.indexOf('guards-v1')
78
+ const seqV1Index = order.indexOf('sequence-v1')
79
+
80
+ expect(patchIndex).toBeGreaterThan(guardsIndex)
81
+ expect(patchIndex).toBeGreaterThan(seqV1Index)
82
+ expect(guardsIndex).toBeGreaterThan(seqV1Index)
83
+ })
84
+
85
+ describe('Cycle Detection', () => {
86
+ it('should throw an error for a simple (A -> B -> A) cycle', () => {
87
+ const jobs = new Map<string, Job>()
88
+ jobs.set('job-A', { name: 'job-A', version: '1', actions: [], depends_on: ['job-B'] })
89
+ jobs.set('job-B', { name: 'job-B', version: '1', actions: [], depends_on: ['job-A'] })
90
+
91
+ expect(() => new DependencyGraph(jobs, new Map())).toThrow(
92
+ /Circular dependency detected: job-A -> job-B -> job-A/
93
+ )
94
+ })
95
+
96
+ it('should throw an error for a longer (A -> B -> C -> A) cycle', () => {
97
+ const jobs = new Map<string, Job>()
98
+ jobs.set('job-A', { name: 'job-A', version: '1', actions: [], depends_on: ['job-B'] })
99
+ jobs.set('job-B', { name: 'job-B', version: '1', actions: [], depends_on: ['job-C'] })
100
+ jobs.set('job-C', { name: 'job-C', version: '1', actions: [], depends_on: ['job-A'] })
101
+
102
+ expect(() => new DependencyGraph(jobs, new Map())).toThrow(
103
+ /Circular dependency detected: job-A -> job-B -> job-C -> job-A/
104
+ )
105
+ })
106
+
107
+ it('should throw an error for a self-referencing cycle', () => {
108
+ const jobs = new Map<string, Job>()
109
+ jobs.set('job-A', { name: 'job-A', version: '1', actions: [], depends_on: ['job-A'] })
110
+
111
+ expect(() => new DependencyGraph(jobs, new Map())).toThrow(
112
+ /Circular dependency detected: job-A -> job-A/
113
+ )
114
+ })
115
+ })
116
+
117
+ it('should throw an error for a dependency on a non-existent job', () => {
118
+ const jobs = new Map<string, Job>()
119
+ jobs.set('job-A', { name: 'job-A', version: '1', actions: [], depends_on: ['job-non-existent'] })
120
+
121
+ expect(() => new DependencyGraph(jobs, new Map())).toThrow(
122
+ 'Invalid dependency: Job "job-A" depends on "job-non-existent", which does not exist.'
123
+ )
124
+ })
125
+ })
@@ -0,0 +1,360 @@
1
+ import { ExecutionEngine } from '../engine'
2
+ import { ExecutionContext } from '../context'
3
+ import { ValueResolver } from '../resolver'
4
+ import { ContractRepository } from '../../contracts/repository'
5
+ import { Action, Network, ReadJsonValue } from '../../types'
6
+ import { VerificationPlatformRegistry } from '../../verification/etherscan'
7
+
8
+ describe('JSON Integration Tests', () => {
9
+ let engine: ExecutionEngine
10
+ let context: ExecutionContext
11
+ let resolver: ValueResolver
12
+ let mockNetwork: Network
13
+ let mockRegistry: ContractRepository
14
+ let templates: Map<string, any>
15
+
16
+ beforeEach(() => {
17
+ mockNetwork = { name: 'testnet', chainId: 999, rpcUrl: 'http://localhost:8545' }
18
+ mockRegistry = new ContractRepository()
19
+
20
+ // Create a mock context that doesn't require a real connection
21
+ context = {
22
+ getNetwork: () => mockNetwork,
23
+ setOutput: jest.fn(),
24
+ getOutput: jest.fn(),
25
+ setContextPath: jest.fn(),
26
+ getContextPath: jest.fn(),
27
+ dispose: jest.fn(),
28
+ provider: {} as any,
29
+ contractRepository: mockRegistry
30
+ } as any
31
+
32
+ templates = new Map()
33
+ const verificationRegistry = new VerificationPlatformRegistry()
34
+ engine = new ExecutionEngine(templates, undefined, verificationRegistry)
35
+ resolver = new ValueResolver()
36
+ })
37
+
38
+ describe('ReadJsonValue resolver', () => {
39
+ it('should extract nested values from JSON objects', async () => {
40
+ const testJson = {
41
+ txs: {
42
+ to: '0x596aF90CecdBF9A768886E771178fd5561dD27Ab',
43
+ data: '0x1234'
44
+ }
45
+ }
46
+
47
+ const value: ReadJsonValue = {
48
+ type: 'read-json',
49
+ arguments: {
50
+ json: testJson,
51
+ path: 'txs.data'
52
+ }
53
+ }
54
+
55
+ const result = await resolver.resolve(value, context)
56
+ expect(result).toBe('0x1234')
57
+ })
58
+
59
+ it('should extract nested address values', async () => {
60
+ const testJson = {
61
+ txs: {
62
+ to: '0x596aF90CecdBF9A768886E771178fd5561dD27Ab',
63
+ data: '0x1234'
64
+ }
65
+ }
66
+
67
+ const value: ReadJsonValue = {
68
+ type: 'read-json',
69
+ arguments: {
70
+ json: testJson,
71
+ path: 'txs.to'
72
+ }
73
+ }
74
+
75
+ const result = await resolver.resolve(value, context)
76
+ expect(result).toBe('0x596aF90CecdBF9A768886E771178fd5561dD27Ab')
77
+ })
78
+
79
+ it('should handle array access', async () => {
80
+ const testJson = {
81
+ transactions: [
82
+ { hash: '0xabc123', value: '1000' },
83
+ { hash: '0xdef456', value: '2000' }
84
+ ]
85
+ }
86
+
87
+ const value: ReadJsonValue = {
88
+ type: 'read-json',
89
+ arguments: {
90
+ json: testJson,
91
+ path: 'transactions.1.hash'
92
+ }
93
+ }
94
+
95
+ const result = await resolver.resolve(value, context)
96
+ expect(result).toBe('0xdef456')
97
+ })
98
+
99
+ it('should handle deeply nested objects', async () => {
100
+ const testJson = {
101
+ response: {
102
+ data: {
103
+ blockchain: {
104
+ ethereum: {
105
+ contracts: {
106
+ token: {
107
+ address: '0x123456789',
108
+ symbol: 'TEST'
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
116
+
117
+ const value: ReadJsonValue = {
118
+ type: 'read-json',
119
+ arguments: {
120
+ json: testJson,
121
+ path: 'response.data.blockchain.ethereum.contracts.token.symbol'
122
+ }
123
+ }
124
+
125
+ const result = await resolver.resolve(value, context)
126
+ expect(result).toBe('TEST')
127
+ })
128
+
129
+ it('should return entire object when path is empty', async () => {
130
+ const testJson = { name: 'test', value: 42 }
131
+
132
+ const value: ReadJsonValue = {
133
+ type: 'read-json',
134
+ arguments: {
135
+ json: testJson,
136
+ path: ''
137
+ }
138
+ }
139
+
140
+ const result = await resolver.resolve(value, context)
141
+ expect(result).toEqual(testJson)
142
+ })
143
+
144
+ it('should throw error for invalid paths', async () => {
145
+ const testJson = { name: 'test' }
146
+
147
+ const value: ReadJsonValue = {
148
+ type: 'read-json',
149
+ arguments: {
150
+ json: testJson,
151
+ path: 'nonexistent.field'
152
+ }
153
+ }
154
+
155
+ await expect(resolver.resolve(value, context)).rejects.toThrow(
156
+ 'read-json: Failed to access path "nonexistent.field"'
157
+ )
158
+ })
159
+
160
+ it('should handle null and undefined values gracefully', async () => {
161
+ const testJson = {
162
+ data: {
163
+ value: null,
164
+ missing: undefined
165
+ }
166
+ }
167
+
168
+ const nullValue: ReadJsonValue = {
169
+ type: 'read-json',
170
+ arguments: {
171
+ json: testJson,
172
+ path: 'data.value'
173
+ }
174
+ }
175
+
176
+ const result = await resolver.resolve(nullValue, context)
177
+ expect(result).toBeNull()
178
+ })
179
+
180
+ it('should work with template variables', async () => {
181
+ // Mock context to return a JSON object when resolving a template variable
182
+ const mockJson = {
183
+ api: {
184
+ response: {
185
+ status: 'success',
186
+ data: '0xabcdef'
187
+ }
188
+ }
189
+ }
190
+
191
+ // Mock the resolver to handle template variable resolution
192
+ const originalResolve = resolver.resolve.bind(resolver)
193
+ jest.spyOn(resolver, 'resolve').mockImplementation(async (value, ctx, scope) => {
194
+ if (value === '{{apiResponse}}') {
195
+ return mockJson
196
+ }
197
+ if (value === '{{extractPath}}') {
198
+ return 'api.response.data'
199
+ }
200
+ return originalResolve(value, ctx, scope)
201
+ })
202
+
203
+ const value: ReadJsonValue = {
204
+ type: 'read-json',
205
+ arguments: {
206
+ json: '{{apiResponse}}',
207
+ path: '{{extractPath}}'
208
+ }
209
+ }
210
+
211
+ const result = await resolver.resolve(value, context)
212
+ expect(result).toBe('0xabcdef')
213
+ })
214
+ })
215
+
216
+ describe('JsonRequestAction integration', () => {
217
+ it('should handle json-request action type validation', () => {
218
+ const action: Action = {
219
+ type: 'json-request',
220
+ name: 'test-request',
221
+ arguments: {
222
+ url: 'https://api.example.com/data',
223
+ method: 'GET'
224
+ }
225
+ }
226
+
227
+ expect(action.type).toBe('json-request')
228
+ expect(action.arguments.url).toBe('https://api.example.com/data')
229
+ expect(action.arguments.method).toBe('GET')
230
+ })
231
+
232
+ it('should validate required url parameter', async () => {
233
+ const action: Action = {
234
+ type: 'json-request',
235
+ name: 'test-request',
236
+ arguments: {
237
+ url: null as any
238
+ }
239
+ }
240
+
241
+ // Mock the engine's executePrimitive method to test validation
242
+ const mockEngine = {
243
+ resolver: {
244
+ resolve: jest.fn().mockResolvedValue(null)
245
+ }
246
+ }
247
+
248
+ // The engine should validate that url is a string
249
+ expect(mockEngine.resolver.resolve).toBeDefined()
250
+ })
251
+ })
252
+
253
+ describe('End-to-end workflow simulation', () => {
254
+ it('should simulate the Guard API example workflow', async () => {
255
+ // Simulate the API response from Guard
256
+ const mockApiResponse = {
257
+ txs: {
258
+ to: '0x596aF90CecdBF9A768886E771178fd5561dD27Ab',
259
+ data: '0x1234'
260
+ }
261
+ }
262
+
263
+ // Step 1: Simulate storing the API response in context
264
+ context.setOutput('guard-patch-request.response', mockApiResponse)
265
+
266
+ // Step 2: Extract the data using read-json
267
+ const extractDataValue: ReadJsonValue = {
268
+ type: 'read-json',
269
+ arguments: {
270
+ json: mockApiResponse,
271
+ path: 'txs.data'
272
+ }
273
+ }
274
+
275
+ const extractedData = await resolver.resolve(extractDataValue, context)
276
+ expect(extractedData).toBe('0x1234')
277
+
278
+ // Step 3: Extract the to address using read-json
279
+ const extractToValue: ReadJsonValue = {
280
+ type: 'read-json',
281
+ arguments: {
282
+ json: mockApiResponse,
283
+ path: 'txs.to'
284
+ }
285
+ }
286
+
287
+ const extractedTo = await resolver.resolve(extractToValue, context)
288
+ expect(extractedTo).toBe('0x596aF90CecdBF9A768886E771178fd5561dD27Ab')
289
+
290
+ // Verify both values are correctly extracted
291
+ expect(extractedData).toBe('0x1234')
292
+ expect(extractedTo).toBe('0x596aF90CecdBF9A768886E771178fd5561dD27Ab')
293
+ })
294
+
295
+ it('should handle complex nested API responses', async () => {
296
+ const complexApiResponse = {
297
+ status: 'success',
298
+ data: {
299
+ blockchain: 'ethereum',
300
+ network: 'mainnet',
301
+ transactions: [
302
+ {
303
+ hash: '0xabc123',
304
+ to: '0x111111',
305
+ data: '0xfirst'
306
+ },
307
+ {
308
+ hash: '0xdef456',
309
+ to: '0x222222',
310
+ data: '0xsecond'
311
+ }
312
+ ],
313
+ metadata: {
314
+ timestamp: 1234567890,
315
+ source: 'guard-api'
316
+ }
317
+ }
318
+ }
319
+
320
+ // Extract various nested values
321
+ const statusValue: ReadJsonValue = {
322
+ type: 'read-json',
323
+ arguments: {
324
+ json: complexApiResponse,
325
+ path: 'status'
326
+ }
327
+ }
328
+
329
+ const firstTxData: ReadJsonValue = {
330
+ type: 'read-json',
331
+ arguments: {
332
+ json: complexApiResponse,
333
+ path: 'data.transactions.0.data'
334
+ }
335
+ }
336
+
337
+ const secondTxTo: ReadJsonValue = {
338
+ type: 'read-json',
339
+ arguments: {
340
+ json: complexApiResponse,
341
+ path: 'data.transactions.1.to'
342
+ }
343
+ }
344
+
345
+ const timestamp: ReadJsonValue = {
346
+ type: 'read-json',
347
+ arguments: {
348
+ json: complexApiResponse,
349
+ path: 'data.metadata.timestamp'
350
+ }
351
+ }
352
+
353
+ // Test all extractions
354
+ expect(await resolver.resolve(statusValue, context)).toBe('success')
355
+ expect(await resolver.resolve(firstTxData, context)).toBe('0xfirst')
356
+ expect(await resolver.resolve(secondTxTo, context)).toBe('0x222222')
357
+ expect(await resolver.resolve(timestamp, context)).toBe(1234567890)
358
+ })
359
+ })
360
+ })