@0xsequence/catapult 1.4.0 → 1.5.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 (163) hide show
  1. package/README.md +27 -0
  2. package/dist/lib/__tests__/network-loader.spec.js.map +1 -1
  3. package/dist/lib/core/__tests__/resolver.spec.js +22 -0
  4. package/dist/lib/core/__tests__/resolver.spec.js.map +1 -1
  5. package/dist/lib/core/__tests__/sign-actions.spec.d.ts +2 -0
  6. package/dist/lib/core/__tests__/sign-actions.spec.d.ts.map +1 -0
  7. package/dist/lib/core/__tests__/sign-actions.spec.js +128 -0
  8. package/dist/lib/core/__tests__/sign-actions.spec.js.map +1 -0
  9. package/dist/lib/core/__tests__/signer.spec.d.ts +2 -0
  10. package/dist/lib/core/__tests__/signer.spec.d.ts.map +1 -0
  11. package/dist/lib/core/__tests__/signer.spec.js +40 -0
  12. package/dist/lib/core/__tests__/signer.spec.js.map +1 -0
  13. package/dist/lib/core/context.d.ts +3 -2
  14. package/dist/lib/core/context.d.ts.map +1 -1
  15. package/dist/lib/core/context.js +3 -2
  16. package/dist/lib/core/context.js.map +1 -1
  17. package/dist/lib/core/engine.d.ts +4 -0
  18. package/dist/lib/core/engine.d.ts.map +1 -1
  19. package/dist/lib/core/engine.js +173 -0
  20. package/dist/lib/core/engine.js.map +1 -1
  21. package/dist/lib/core/signer.d.ts +7 -0
  22. package/dist/lib/core/signer.d.ts.map +1 -0
  23. package/dist/lib/core/signer.js +60 -0
  24. package/dist/lib/core/signer.js.map +1 -0
  25. package/dist/lib/parsers/__tests__/source.spec.js +37 -0
  26. package/dist/lib/parsers/__tests__/source.spec.js.map +1 -1
  27. package/dist/lib/parsers/source.js +1 -1
  28. package/dist/lib/parsers/source.js.map +1 -1
  29. package/dist/lib/provenance.js +51 -2
  30. package/dist/lib/provenance.js.map +1 -1
  31. package/dist/lib/types/actions.d.ts +26 -2
  32. package/dist/lib/types/actions.d.ts.map +1 -1
  33. package/dist/lib/types/actions.js +3 -0
  34. package/dist/lib/types/actions.js.map +1 -1
  35. package/dist/lib/types/source.d.ts +2 -0
  36. package/dist/lib/types/source.d.ts.map +1 -1
  37. package/package.json +4 -1
  38. package/.eslintrc.json +0 -29
  39. package/.github/workflows/ci.yml +0 -181
  40. package/CONCEPT.md +0 -24
  41. package/contracts/checked-call.huff +0 -65
  42. package/eslint.config.js +0 -48
  43. package/examples/jobs/guards-v1.yaml +0 -17
  44. package/examples/jobs/sequence-seq-0001-patch.yaml +0 -59
  45. package/examples/jobs/sequence-v1.yaml +0 -59
  46. package/examples/templates/sequence-factory-v1.yaml +0 -56
  47. package/jest.config.js +0 -25
  48. package/src/cli.ts +0 -18
  49. package/src/commands/common.ts +0 -61
  50. package/src/commands/dry.ts +0 -209
  51. package/src/commands/etherscan.ts +0 -360
  52. package/src/commands/index.ts +0 -6
  53. package/src/commands/list.ts +0 -262
  54. package/src/commands/provenance.ts +0 -120
  55. package/src/commands/run.ts +0 -146
  56. package/src/commands/utils.ts +0 -215
  57. package/src/index.ts +0 -67
  58. package/src/lib/__tests__/deployer-events.spec.ts +0 -338
  59. package/src/lib/__tests__/deployer.spec.ts +0 -2269
  60. package/src/lib/__tests__/network-loader.spec.ts +0 -150
  61. package/src/lib/__tests__/network-selection.spec.ts +0 -41
  62. package/src/lib/__tests__/network-utils.spec.ts +0 -230
  63. package/src/lib/__tests__/provenance.spec.ts +0 -208
  64. package/src/lib/artifacts/__tests__/fixtures/contract1.json +0 -19
  65. package/src/lib/artifacts/__tests__/fixtures/contract2.json +0 -19
  66. package/src/lib/artifacts/__tests__/fixtures/duplicate-name.json +0 -19
  67. package/src/lib/artifacts/__tests__/fixtures/nested/nested-contract.json +0 -18
  68. package/src/lib/artifacts/__tests__/fixtures/not-an-artifact.json +0 -8
  69. package/src/lib/artifacts/__tests__/fixtures/readme.txt +0 -2
  70. package/src/lib/contracts/__tests__/repository.spec.ts +0 -612
  71. package/src/lib/contracts/repository.ts +0 -411
  72. package/src/lib/core/__tests__/assert-action.spec.ts +0 -474
  73. package/src/lib/core/__tests__/context.spec.ts +0 -37
  74. package/src/lib/core/__tests__/engine.spec.ts +0 -2005
  75. package/src/lib/core/__tests__/graph.spec.ts +0 -125
  76. package/src/lib/core/__tests__/json-integration.spec.ts +0 -425
  77. package/src/lib/core/__tests__/loader.spec.ts +0 -367
  78. package/src/lib/core/__tests__/multi-platform-verification.spec.ts +0 -406
  79. package/src/lib/core/__tests__/resolver.spec.ts +0 -2496
  80. package/src/lib/core/__tests__/static-action.spec.ts +0 -172
  81. package/src/lib/core/context.ts +0 -127
  82. package/src/lib/core/engine.ts +0 -1834
  83. package/src/lib/core/graph.ts +0 -252
  84. package/src/lib/core/loader.ts +0 -253
  85. package/src/lib/core/resolver.ts +0 -873
  86. package/src/lib/deployer.ts +0 -1005
  87. package/src/lib/events/__tests__/event-system.spec.ts +0 -392
  88. package/src/lib/events/cli-adapter.ts +0 -369
  89. package/src/lib/events/emitter.ts +0 -62
  90. package/src/lib/events/index.ts +0 -3
  91. package/src/lib/events/types.ts +0 -520
  92. package/src/lib/index.ts +0 -17
  93. package/src/lib/network-loader.ts +0 -90
  94. package/src/lib/network-selection.ts +0 -73
  95. package/src/lib/network-utils.ts +0 -64
  96. package/src/lib/parsers/__tests__/buildinfo.spec.ts +0 -122
  97. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-bytecode-buildinfo.json +0 -62
  98. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-json.txt +0 -2
  99. package/src/lib/parsers/__tests__/fixtures/buildinfo/multi-contract-buildinfo.json +0 -89
  100. package/src/lib/parsers/__tests__/fixtures/buildinfo/no-contracts-buildinfo.json +0 -17
  101. package/src/lib/parsers/__tests__/fixtures/buildinfo/simple-buildinfo.json +0 -63
  102. package/src/lib/parsers/__tests__/fixtures/buildinfo/wrong-format.json +0 -4
  103. package/src/lib/parsers/__tests__/job.spec.ts +0 -439
  104. package/src/lib/parsers/__tests__/source.spec.ts +0 -134
  105. package/src/lib/parsers/__tests__/template.spec.ts +0 -111
  106. package/src/lib/parsers/artifact/__tests__/artifact.spec.ts +0 -117
  107. package/src/lib/parsers/artifact/__tests__/fixtures/empty-bytecode.json +0 -5
  108. package/src/lib/parsers/artifact/__tests__/fixtures/hardhat-artifact.json +0 -67
  109. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-bytecode.json +0 -5
  110. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-json.txt +0 -11
  111. package/src/lib/parsers/artifact/__tests__/fixtures/minimal-artifact.json +0 -5
  112. package/src/lib/parsers/artifact/__tests__/fixtures/missing-abi.json +0 -4
  113. package/src/lib/parsers/artifact/__tests__/fixtures/missing-bytecode.json +0 -11
  114. package/src/lib/parsers/artifact/__tests__/fixtures/missing-contract-name.json +0 -11
  115. package/src/lib/parsers/artifact/__tests__/fixtures/simple-artifact.json +0 -40
  116. package/src/lib/parsers/artifact/__tests__/fixtures/wrong-types.json +0 -7
  117. package/src/lib/parsers/artifact/foundry-1.2.ts +0 -72
  118. package/src/lib/parsers/artifact/index.ts +0 -27
  119. package/src/lib/parsers/artifact/types.ts +0 -9
  120. package/src/lib/parsers/buildinfo.ts +0 -127
  121. package/src/lib/parsers/constants.ts +0 -56
  122. package/src/lib/parsers/index.ts +0 -6
  123. package/src/lib/parsers/job.ts +0 -160
  124. package/src/lib/parsers/source.ts +0 -129
  125. package/src/lib/parsers/template.ts +0 -135
  126. package/src/lib/provenance.ts +0 -785
  127. package/src/lib/std/templates/arachnid-deterministic-deployment-proxy.yaml +0 -68
  128. package/src/lib/std/templates/assured-deployment.yaml +0 -46
  129. package/src/lib/std/templates/era-evm-predeploy.yaml +0 -35
  130. package/src/lib/std/templates/erc-2470.yaml +0 -70
  131. package/src/lib/std/templates/min-balance.yaml +0 -35
  132. package/src/lib/std/templates/nano-universal-deployer.yaml +0 -61
  133. package/src/lib/std/templates/raw-erc-2470.yaml +0 -62
  134. package/src/lib/std/templates/raw-nano-universal-deployer.yaml +0 -54
  135. package/src/lib/std/templates/raw-sequence-universal-deployer-2.yaml +0 -52
  136. package/src/lib/std/templates/sequence-universal-deployer-2.yaml +0 -61
  137. package/src/lib/types/__tests__/json-request-action.spec.ts +0 -243
  138. package/src/lib/types/__tests__/read-json-value.spec.ts +0 -278
  139. package/src/lib/types/__tests__/resolve-json-value.spec.ts +0 -769
  140. package/src/lib/types/actions.ts +0 -148
  141. package/src/lib/types/artifacts.ts +0 -21
  142. package/src/lib/types/buildinfo.ts +0 -116
  143. package/src/lib/types/conditions.ts +0 -50
  144. package/src/lib/types/contracts.ts +0 -26
  145. package/src/lib/types/definitions.ts +0 -77
  146. package/src/lib/types/index.ts +0 -9
  147. package/src/lib/types/network.ts +0 -33
  148. package/src/lib/types/project.ts +0 -9
  149. package/src/lib/types/source.ts +0 -26
  150. package/src/lib/types/task.ts +0 -9
  151. package/src/lib/types/values.ts +0 -221
  152. package/src/lib/utils/assertion.ts +0 -24
  153. package/src/lib/utils/validation.ts +0 -116
  154. package/src/lib/validation/contract-references.ts +0 -210
  155. package/src/lib/validation/index.ts +0 -1
  156. package/src/lib/verification/__tests__/etherscan.spec.ts +0 -710
  157. package/src/lib/verification/__tests__/sourcify.spec.ts +0 -288
  158. package/src/lib/verification/etherscan.ts +0 -547
  159. package/src/lib/verification/sourcify.ts +0 -248
  160. package/test_validation/artifacts/TestContract.json +0 -9
  161. package/test_validation/jobs/test-missing.yaml +0 -16
  162. package/test_validation/networks.yaml +0 -3
  163. package/tsconfig.json +0 -36
@@ -1,367 +0,0 @@
1
- import * as fs from 'fs/promises'
2
- import * as path from 'path'
3
- import { randomBytes } from 'crypto'
4
- import { ProjectLoader } from '../loader'
5
- import { Job, Template } from '../../types'
6
-
7
- describe('ProjectLoader', () => {
8
- let tempDir: string
9
- let testRunId: string
10
- let baseTestDir: string
11
-
12
- beforeAll(() => {
13
- // Generate unique test run ID
14
- testRunId = `test_${Date.now()}_${randomBytes(4).toString('hex')}`
15
- baseTestDir = `/tmp/catapult_testing/${testRunId}`
16
- })
17
-
18
- beforeEach(async () => {
19
- // Create a unique temporary directory for each test
20
- const testId = randomBytes(4).toString('hex')
21
- tempDir = path.join(baseTestDir, testId)
22
- await fs.mkdir(tempDir, { recursive: true })
23
- })
24
-
25
- afterEach(async () => {
26
- // Clean up individual test directory
27
- try {
28
- await fs.rm(tempDir, { recursive: true, force: true })
29
- } catch (error) {
30
- // Ignore cleanup errors for individual tests
31
- }
32
- })
33
-
34
- afterAll(async () => {
35
- // Clean up entire test run directory as safety net
36
- try {
37
- await fs.rm(baseTestDir, { recursive: true, force: true })
38
- } catch (error) {
39
- // Ignore cleanup errors
40
- }
41
- })
42
-
43
- describe('job loading', () => {
44
- it('should load jobs from the root jobs directory', async () => {
45
- const jobsDir = path.join(tempDir, 'jobs')
46
- await fs.mkdir(jobsDir, { recursive: true })
47
-
48
- const jobYaml = `name: "test-job"
49
- version: "1"
50
- description: "A test job"
51
- depends_on: []
52
- actions:
53
- - name: "test-action"
54
- template: "test-template"
55
- arguments: {}`
56
-
57
- await fs.writeFile(path.join(jobsDir, 'test-job.yaml'), jobYaml)
58
-
59
- const loader = new ProjectLoader(tempDir)
60
- await loader.load()
61
-
62
- expect(loader.jobs.size).toBe(1)
63
- expect(loader.jobs.has('test-job')).toBe(true)
64
-
65
- const job = loader.jobs.get('test-job')!
66
- expect(job.name).toBe('test-job')
67
- expect(job.version).toBe('1')
68
- expect(job.description).toBe('A test job')
69
- })
70
-
71
- it('should recursively load jobs from nested directories', async () => {
72
- const jobsDir = path.join(tempDir, 'jobs')
73
- const nestedDir = path.join(jobsDir, 'nested', 'deeper')
74
- await fs.mkdir(nestedDir, { recursive: true })
75
-
76
- // Root level job
77
- const rootJobYaml = `name: "root-job"
78
- version: "1"
79
- description: "Root level job"
80
- depends_on: []
81
- actions: []`
82
-
83
- // Nested job
84
- const nestedJobYaml = `name: "nested-job"
85
- version: "1"
86
- description: "Nested job"
87
- depends_on: []
88
- actions: []`
89
-
90
- // Deep nested job
91
- const deepJobYaml = `name: "deep-job"
92
- version: "1"
93
- description: "Deep nested job"
94
- depends_on: []
95
- actions: []`
96
-
97
- await fs.writeFile(path.join(jobsDir, 'root-job.yaml'), rootJobYaml)
98
- await fs.writeFile(path.join(jobsDir, 'nested', 'nested-job.yml'), nestedJobYaml)
99
- await fs.writeFile(path.join(nestedDir, 'deep-job.yaml'), deepJobYaml)
100
-
101
- const loader = new ProjectLoader(tempDir)
102
- await loader.load()
103
-
104
- expect(loader.jobs.size).toBe(3)
105
- expect(loader.jobs.has('root-job')).toBe(true)
106
- expect(loader.jobs.has('nested-job')).toBe(true)
107
- expect(loader.jobs.has('deep-job')).toBe(true)
108
- })
109
-
110
- it('should ignore jobs in node_modules and other ignored directories', async () => {
111
- const jobsDir = path.join(tempDir, 'jobs')
112
- const nodeModulesDir = path.join(jobsDir, 'node_modules')
113
- const distDir = path.join(jobsDir, 'dist')
114
- await fs.mkdir(nodeModulesDir, { recursive: true })
115
- await fs.mkdir(distDir, { recursive: true })
116
-
117
- const validJobYaml = `name: "valid-job"
118
- version: "1"
119
- actions: []`
120
-
121
- const ignoredJobYaml = `name: "ignored-job"
122
- version: "1"
123
- actions: []`
124
-
125
- await fs.writeFile(path.join(jobsDir, 'valid-job.yaml'), validJobYaml)
126
- await fs.writeFile(path.join(nodeModulesDir, 'ignored-job.yaml'), ignoredJobYaml)
127
- await fs.writeFile(path.join(distDir, 'ignored-job2.yaml'), ignoredJobYaml)
128
-
129
- const loader = new ProjectLoader(tempDir)
130
- await loader.load()
131
-
132
- expect(loader.jobs.size).toBe(1)
133
- expect(loader.jobs.has('valid-job')).toBe(true)
134
- expect(loader.jobs.has('ignored-job')).toBe(false)
135
- })
136
-
137
- it('should handle malformed job files gracefully', async () => {
138
- const jobsDir = path.join(tempDir, 'jobs')
139
- await fs.mkdir(jobsDir, { recursive: true })
140
-
141
- const validJobYaml = `name: "valid-job"
142
- version: "1"
143
- actions: []`
144
-
145
- const invalidJobYaml = `invalid: yaml: content: [[[`
146
-
147
- await fs.writeFile(path.join(jobsDir, 'valid-job.yaml'), validJobYaml)
148
- await fs.writeFile(path.join(jobsDir, 'invalid-job.yaml'), invalidJobYaml)
149
-
150
- const loader = new ProjectLoader(tempDir)
151
- await loader.load()
152
-
153
- // Should load the valid job and skip the invalid one
154
- expect(loader.jobs.size).toBe(1)
155
- expect(loader.jobs.has('valid-job')).toBe(true)
156
- })
157
-
158
- it('should skip known non-job YAML documents under jobs without warning', async () => {
159
- const jobsDir = path.join(tempDir, 'jobs')
160
- const buildInfoDir = path.join(jobsDir, 'stack', 'build-info', 'rc-5')
161
- await fs.mkdir(buildInfoDir, { recursive: true })
162
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => undefined)
163
-
164
- const validJobYaml = `name: "valid-job"
165
- version: "1"
166
- actions: []`
167
-
168
- await fs.writeFile(path.join(jobsDir, 'valid-job.yaml'), validJobYaml)
169
- await fs.writeFile(path.join(buildInfoDir, 'source.yaml'), `
170
- type: source
171
- build_info: {}
172
- `)
173
- await fs.writeFile(path.join(jobsDir, 'constants.yaml'), `
174
- type: constants
175
- constants:
176
- value: 1
177
- `)
178
-
179
- try {
180
- const loader = new ProjectLoader(tempDir)
181
- await loader.load()
182
-
183
- expect(loader.jobs.size).toBe(1)
184
- expect(loader.jobs.has('valid-job')).toBe(true)
185
- expect(warnSpy).not.toHaveBeenCalled()
186
- } finally {
187
- warnSpy.mockRestore()
188
- }
189
- })
190
- })
191
-
192
- describe('template loading', () => {
193
- it('should load templates from the root templates directory', async () => {
194
- const templatesDir = path.join(tempDir, 'templates')
195
- await fs.mkdir(templatesDir, { recursive: true })
196
-
197
- const templateYaml = `name: "test-template"
198
- description: "A test template"
199
- actions:
200
- - name: "test-action"
201
- arguments: {}`
202
-
203
- await fs.writeFile(path.join(templatesDir, 'test-template.yaml'), templateYaml)
204
-
205
- const loader = new ProjectLoader(tempDir)
206
- await loader.load()
207
-
208
- expect(loader.templates.size).toBeGreaterThan(0) // Includes std templates
209
- expect(loader.templates.has('test-template')).toBe(true)
210
-
211
- const template = loader.templates.get('test-template')!
212
- expect(template.name).toBe('test-template')
213
- expect(template.description).toBe('A test template')
214
- })
215
-
216
- it('should recursively load templates from nested directories', async () => {
217
- const templatesDir = path.join(tempDir, 'templates')
218
- const nestedDir = path.join(templatesDir, 'nested')
219
- await fs.mkdir(nestedDir, { recursive: true })
220
-
221
- const rootTemplateYaml = `name: "root-template"
222
- actions: []`
223
-
224
- const nestedTemplateYaml = `name: "nested-template"
225
- actions: []`
226
-
227
- await fs.writeFile(path.join(templatesDir, 'root-template.yaml'), rootTemplateYaml)
228
- await fs.writeFile(path.join(nestedDir, 'nested-template.yml'), nestedTemplateYaml)
229
-
230
- const loader = new ProjectLoader(tempDir)
231
- await loader.load()
232
-
233
- expect(loader.templates.has('root-template')).toBe(true)
234
- expect(loader.templates.has('nested-template')).toBe(true)
235
- })
236
- })
237
-
238
- describe('artifact loading', () => {
239
- it('should load artifacts from nested directories', async () => {
240
- const artifactsDir = path.join(tempDir, 'artifacts', 'contracts')
241
- await fs.mkdir(artifactsDir, { recursive: true })
242
-
243
- const artifactJson = {
244
- contractName: "TestContract",
245
- abi: [],
246
- bytecode: "0x608060405234801561001057600080fd5b50",
247
- deployedBytecode: "0x608060405234801561001057600080fd5b50"
248
- }
249
-
250
- await fs.writeFile(path.join(artifactsDir, 'TestContract.json'), JSON.stringify(artifactJson))
251
-
252
- const loader = new ProjectLoader(tempDir)
253
- await loader.load()
254
-
255
- expect(loader.contractRepository.lookup('TestContract')).toBeDefined()
256
- })
257
- })
258
-
259
- describe('edge cases', () => {
260
- it('should handle missing jobs directory gracefully', async () => {
261
- const loader = new ProjectLoader(tempDir)
262
- await loader.load()
263
-
264
- expect(loader.jobs.size).toBe(0)
265
- })
266
-
267
- it('should handle missing templates directory gracefully', async () => {
268
- const loader = new ProjectLoader(tempDir, { loadStdTemplates: false })
269
- await loader.load()
270
-
271
- expect(loader.templates.size).toBe(0)
272
- })
273
-
274
- it('should load standard templates by default', async () => {
275
- const loader = new ProjectLoader(tempDir)
276
- await loader.load()
277
-
278
- // Standard templates should be loaded
279
- expect(loader.templates.size).toBeGreaterThan(0)
280
- })
281
-
282
- it('should skip standard templates when disabled', async () => {
283
- const loader = new ProjectLoader(tempDir, { loadStdTemplates: false })
284
- await loader.load()
285
-
286
- expect(loader.templates.size).toBe(0)
287
- })
288
- })
289
-
290
- describe('real project structure', () => {
291
- it('should load the examples project structure', async () => {
292
- const examplesRoot = path.resolve(__dirname, '../../../../examples')
293
- const loader = new ProjectLoader(examplesRoot)
294
- await loader.load()
295
-
296
- // Should load some jobs and templates from examples
297
- expect(loader.jobs.size).toBeGreaterThan(0)
298
- expect(loader.templates.size).toBeGreaterThan(0)
299
-
300
- // Check for known jobs from examples
301
- expect(loader.jobs.has('sequence-v1')).toBe(true)
302
- expect(loader.jobs.has('guards-v1')).toBe(true)
303
- })
304
-
305
- it('should load nested jobs from subdirectories', async () => {
306
- // Create a nested job structure similar to examples2
307
- const jobsDir = path.join(tempDir, 'jobs')
308
- const testContractDir = path.join(jobsDir, 'test_contract')
309
- const artifactsDir = path.join(testContractDir, 'artifacts')
310
-
311
- await fs.mkdir(artifactsDir, { recursive: true })
312
-
313
- // Create the nested job file
314
- const jobYaml = `name: "test-contract-deployment"
315
- version: "1"
316
- description: "Deploy a test contract"
317
- depends_on: []
318
-
319
- actions:
320
- - name: "deploy-test-contract"
321
- template: "sequence-universal-deployer-2"
322
- arguments:
323
- salt: "0x0000000000000000000000000000000000000000000000000000000000000003"
324
- creationCode: "{{creationCode(./artifacts/counter.json)}}"`
325
-
326
- // Create a sample artifact file
327
- const artifactJson = {
328
- abi: [
329
- {
330
- type: "function",
331
- name: "increment",
332
- inputs: [],
333
- outputs: [],
334
- stateMutability: "nonpayable"
335
- },
336
- {
337
- type: "function",
338
- name: "number",
339
- inputs: [],
340
- outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
341
- stateMutability: "view"
342
- }
343
- ],
344
- bytecode: {
345
- object: "0x6080604052348015600e575f5ffd5b5060c180601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80638381f58a146034578063d09de08a14604d575b5f5ffd5b603b5f5481565b60405190815260200160405180910390f35b60536055565b005b5f805490806061836068565b9190505550565b5f60018201608457634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122074300f82bc4b1d0eec22668b0edf09603d979df755b8315a9a2493d4f5c293c364736f6c634300081e0033"
346
- },
347
- deployedBytecode: {
348
- object: "0x6080604052348015600e575f5ffd5b50600436106030575f3560e01c80638381f58a146034578063d09de08a14604d575b5f5ffd5b603b5f5481565b60405190815260200160405180910390f35b60536055565b005b5f805490806061836068565b9190505550565b5f60018201608457634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122074300f82bc4b1d0eec22668b0edf09603d979df755b8315a9a2493d4f5c293c364736f6c634300081e0033"
349
- }
350
- }
351
-
352
- await fs.writeFile(path.join(testContractDir, 'demo_contract.yaml'), jobYaml)
353
- await fs.writeFile(path.join(artifactsDir, 'counter.json'), JSON.stringify(artifactJson))
354
-
355
- const loader = new ProjectLoader(tempDir)
356
- await loader.load()
357
-
358
- // Should load the nested job
359
- expect(loader.jobs.size).toBeGreaterThan(0)
360
- expect(loader.jobs.has('test-contract-deployment')).toBe(true)
361
-
362
- const job = loader.jobs.get('test-contract-deployment')!
363
- expect(job.name).toBe('test-contract-deployment')
364
- expect(job.description).toBe('Deploy a test contract')
365
- })
366
- })
367
- })