@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.
- package/README.md +27 -0
- package/dist/lib/__tests__/network-loader.spec.js.map +1 -1
- package/dist/lib/core/__tests__/resolver.spec.js +22 -0
- package/dist/lib/core/__tests__/resolver.spec.js.map +1 -1
- package/dist/lib/core/__tests__/sign-actions.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/sign-actions.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/sign-actions.spec.js +128 -0
- package/dist/lib/core/__tests__/sign-actions.spec.js.map +1 -0
- package/dist/lib/core/__tests__/signer.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/signer.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/signer.spec.js +40 -0
- package/dist/lib/core/__tests__/signer.spec.js.map +1 -0
- package/dist/lib/core/context.d.ts +3 -2
- package/dist/lib/core/context.d.ts.map +1 -1
- package/dist/lib/core/context.js +3 -2
- package/dist/lib/core/context.js.map +1 -1
- package/dist/lib/core/engine.d.ts +4 -0
- package/dist/lib/core/engine.d.ts.map +1 -1
- package/dist/lib/core/engine.js +173 -0
- package/dist/lib/core/engine.js.map +1 -1
- package/dist/lib/core/signer.d.ts +7 -0
- package/dist/lib/core/signer.d.ts.map +1 -0
- package/dist/lib/core/signer.js +60 -0
- package/dist/lib/core/signer.js.map +1 -0
- package/dist/lib/parsers/__tests__/source.spec.js +37 -0
- package/dist/lib/parsers/__tests__/source.spec.js.map +1 -1
- package/dist/lib/parsers/source.js +1 -1
- package/dist/lib/parsers/source.js.map +1 -1
- package/dist/lib/provenance.js +51 -2
- package/dist/lib/provenance.js.map +1 -1
- package/dist/lib/types/actions.d.ts +26 -2
- package/dist/lib/types/actions.d.ts.map +1 -1
- package/dist/lib/types/actions.js +3 -0
- package/dist/lib/types/actions.js.map +1 -1
- package/dist/lib/types/source.d.ts +2 -0
- package/dist/lib/types/source.d.ts.map +1 -1
- package/package.json +4 -1
- package/.eslintrc.json +0 -29
- package/.github/workflows/ci.yml +0 -181
- package/CONCEPT.md +0 -24
- package/contracts/checked-call.huff +0 -65
- package/eslint.config.js +0 -48
- package/examples/jobs/guards-v1.yaml +0 -17
- package/examples/jobs/sequence-seq-0001-patch.yaml +0 -59
- package/examples/jobs/sequence-v1.yaml +0 -59
- package/examples/templates/sequence-factory-v1.yaml +0 -56
- package/jest.config.js +0 -25
- package/src/cli.ts +0 -18
- package/src/commands/common.ts +0 -61
- package/src/commands/dry.ts +0 -209
- package/src/commands/etherscan.ts +0 -360
- package/src/commands/index.ts +0 -6
- package/src/commands/list.ts +0 -262
- package/src/commands/provenance.ts +0 -120
- package/src/commands/run.ts +0 -146
- package/src/commands/utils.ts +0 -215
- package/src/index.ts +0 -67
- package/src/lib/__tests__/deployer-events.spec.ts +0 -338
- package/src/lib/__tests__/deployer.spec.ts +0 -2269
- package/src/lib/__tests__/network-loader.spec.ts +0 -150
- package/src/lib/__tests__/network-selection.spec.ts +0 -41
- package/src/lib/__tests__/network-utils.spec.ts +0 -230
- package/src/lib/__tests__/provenance.spec.ts +0 -208
- package/src/lib/artifacts/__tests__/fixtures/contract1.json +0 -19
- package/src/lib/artifacts/__tests__/fixtures/contract2.json +0 -19
- package/src/lib/artifacts/__tests__/fixtures/duplicate-name.json +0 -19
- package/src/lib/artifacts/__tests__/fixtures/nested/nested-contract.json +0 -18
- package/src/lib/artifacts/__tests__/fixtures/not-an-artifact.json +0 -8
- package/src/lib/artifacts/__tests__/fixtures/readme.txt +0 -2
- package/src/lib/contracts/__tests__/repository.spec.ts +0 -612
- package/src/lib/contracts/repository.ts +0 -411
- package/src/lib/core/__tests__/assert-action.spec.ts +0 -474
- package/src/lib/core/__tests__/context.spec.ts +0 -37
- package/src/lib/core/__tests__/engine.spec.ts +0 -2005
- package/src/lib/core/__tests__/graph.spec.ts +0 -125
- package/src/lib/core/__tests__/json-integration.spec.ts +0 -425
- package/src/lib/core/__tests__/loader.spec.ts +0 -367
- package/src/lib/core/__tests__/multi-platform-verification.spec.ts +0 -406
- package/src/lib/core/__tests__/resolver.spec.ts +0 -2496
- package/src/lib/core/__tests__/static-action.spec.ts +0 -172
- package/src/lib/core/context.ts +0 -127
- package/src/lib/core/engine.ts +0 -1834
- package/src/lib/core/graph.ts +0 -252
- package/src/lib/core/loader.ts +0 -253
- package/src/lib/core/resolver.ts +0 -873
- package/src/lib/deployer.ts +0 -1005
- package/src/lib/events/__tests__/event-system.spec.ts +0 -392
- package/src/lib/events/cli-adapter.ts +0 -369
- package/src/lib/events/emitter.ts +0 -62
- package/src/lib/events/index.ts +0 -3
- package/src/lib/events/types.ts +0 -520
- package/src/lib/index.ts +0 -17
- package/src/lib/network-loader.ts +0 -90
- package/src/lib/network-selection.ts +0 -73
- package/src/lib/network-utils.ts +0 -64
- package/src/lib/parsers/__tests__/buildinfo.spec.ts +0 -122
- package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-bytecode-buildinfo.json +0 -62
- package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-json.txt +0 -2
- package/src/lib/parsers/__tests__/fixtures/buildinfo/multi-contract-buildinfo.json +0 -89
- package/src/lib/parsers/__tests__/fixtures/buildinfo/no-contracts-buildinfo.json +0 -17
- package/src/lib/parsers/__tests__/fixtures/buildinfo/simple-buildinfo.json +0 -63
- package/src/lib/parsers/__tests__/fixtures/buildinfo/wrong-format.json +0 -4
- package/src/lib/parsers/__tests__/job.spec.ts +0 -439
- package/src/lib/parsers/__tests__/source.spec.ts +0 -134
- package/src/lib/parsers/__tests__/template.spec.ts +0 -111
- package/src/lib/parsers/artifact/__tests__/artifact.spec.ts +0 -117
- package/src/lib/parsers/artifact/__tests__/fixtures/empty-bytecode.json +0 -5
- package/src/lib/parsers/artifact/__tests__/fixtures/hardhat-artifact.json +0 -67
- package/src/lib/parsers/artifact/__tests__/fixtures/invalid-bytecode.json +0 -5
- package/src/lib/parsers/artifact/__tests__/fixtures/invalid-json.txt +0 -11
- package/src/lib/parsers/artifact/__tests__/fixtures/minimal-artifact.json +0 -5
- package/src/lib/parsers/artifact/__tests__/fixtures/missing-abi.json +0 -4
- package/src/lib/parsers/artifact/__tests__/fixtures/missing-bytecode.json +0 -11
- package/src/lib/parsers/artifact/__tests__/fixtures/missing-contract-name.json +0 -11
- package/src/lib/parsers/artifact/__tests__/fixtures/simple-artifact.json +0 -40
- package/src/lib/parsers/artifact/__tests__/fixtures/wrong-types.json +0 -7
- package/src/lib/parsers/artifact/foundry-1.2.ts +0 -72
- package/src/lib/parsers/artifact/index.ts +0 -27
- package/src/lib/parsers/artifact/types.ts +0 -9
- package/src/lib/parsers/buildinfo.ts +0 -127
- package/src/lib/parsers/constants.ts +0 -56
- package/src/lib/parsers/index.ts +0 -6
- package/src/lib/parsers/job.ts +0 -160
- package/src/lib/parsers/source.ts +0 -129
- package/src/lib/parsers/template.ts +0 -135
- package/src/lib/provenance.ts +0 -785
- package/src/lib/std/templates/arachnid-deterministic-deployment-proxy.yaml +0 -68
- package/src/lib/std/templates/assured-deployment.yaml +0 -46
- package/src/lib/std/templates/era-evm-predeploy.yaml +0 -35
- package/src/lib/std/templates/erc-2470.yaml +0 -70
- package/src/lib/std/templates/min-balance.yaml +0 -35
- package/src/lib/std/templates/nano-universal-deployer.yaml +0 -61
- package/src/lib/std/templates/raw-erc-2470.yaml +0 -62
- package/src/lib/std/templates/raw-nano-universal-deployer.yaml +0 -54
- package/src/lib/std/templates/raw-sequence-universal-deployer-2.yaml +0 -52
- package/src/lib/std/templates/sequence-universal-deployer-2.yaml +0 -61
- package/src/lib/types/__tests__/json-request-action.spec.ts +0 -243
- package/src/lib/types/__tests__/read-json-value.spec.ts +0 -278
- package/src/lib/types/__tests__/resolve-json-value.spec.ts +0 -769
- package/src/lib/types/actions.ts +0 -148
- package/src/lib/types/artifacts.ts +0 -21
- package/src/lib/types/buildinfo.ts +0 -116
- package/src/lib/types/conditions.ts +0 -50
- package/src/lib/types/contracts.ts +0 -26
- package/src/lib/types/definitions.ts +0 -77
- package/src/lib/types/index.ts +0 -9
- package/src/lib/types/network.ts +0 -33
- package/src/lib/types/project.ts +0 -9
- package/src/lib/types/source.ts +0 -26
- package/src/lib/types/task.ts +0 -9
- package/src/lib/types/values.ts +0 -221
- package/src/lib/utils/assertion.ts +0 -24
- package/src/lib/utils/validation.ts +0 -116
- package/src/lib/validation/contract-references.ts +0 -210
- package/src/lib/validation/index.ts +0 -1
- package/src/lib/verification/__tests__/etherscan.spec.ts +0 -710
- package/src/lib/verification/__tests__/sourcify.spec.ts +0 -288
- package/src/lib/verification/etherscan.ts +0 -547
- package/src/lib/verification/sourcify.ts +0 -248
- package/test_validation/artifacts/TestContract.json +0 -9
- package/test_validation/jobs/test-missing.yaml +0 -16
- package/test_validation/networks.yaml +0 -3
- 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
|
-
})
|