@0xsequence/catapult 1.3.17 → 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 (232) hide show
  1. package/README.md +276 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +1 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/index.d.ts +1 -0
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +1 -0
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/list.d.ts.map +1 -1
  10. package/dist/commands/list.js +12 -0
  11. package/dist/commands/list.js.map +1 -1
  12. package/dist/commands/provenance.d.ts +3 -0
  13. package/dist/commands/provenance.d.ts.map +1 -0
  14. package/dist/commands/provenance.js +138 -0
  15. package/dist/commands/provenance.js.map +1 -0
  16. package/dist/lib/__tests__/deployer.spec.js +118 -1
  17. package/dist/lib/__tests__/deployer.spec.js.map +1 -1
  18. package/dist/lib/__tests__/network-loader.spec.js.map +1 -1
  19. package/dist/lib/__tests__/provenance.spec.d.ts +2 -0
  20. package/dist/lib/__tests__/provenance.spec.d.ts.map +1 -0
  21. package/dist/lib/__tests__/provenance.spec.js +205 -0
  22. package/dist/lib/__tests__/provenance.spec.js.map +1 -0
  23. package/dist/lib/contracts/__tests__/repository.spec.js +243 -0
  24. package/dist/lib/contracts/__tests__/repository.spec.js.map +1 -1
  25. package/dist/lib/contracts/repository.d.ts +9 -1
  26. package/dist/lib/contracts/repository.d.ts.map +1 -1
  27. package/dist/lib/contracts/repository.js +93 -7
  28. package/dist/lib/contracts/repository.js.map +1 -1
  29. package/dist/lib/core/__tests__/assert-action.spec.d.ts +2 -0
  30. package/dist/lib/core/__tests__/assert-action.spec.d.ts.map +1 -0
  31. package/dist/lib/core/__tests__/assert-action.spec.js +377 -0
  32. package/dist/lib/core/__tests__/assert-action.spec.js.map +1 -0
  33. package/dist/lib/core/__tests__/engine.spec.js +80 -0
  34. package/dist/lib/core/__tests__/engine.spec.js.map +1 -1
  35. package/dist/lib/core/__tests__/loader.spec.js +29 -0
  36. package/dist/lib/core/__tests__/loader.spec.js.map +1 -1
  37. package/dist/lib/core/__tests__/resolver.spec.js +405 -0
  38. package/dist/lib/core/__tests__/resolver.spec.js.map +1 -1
  39. package/dist/lib/core/__tests__/sign-actions.spec.d.ts +2 -0
  40. package/dist/lib/core/__tests__/sign-actions.spec.d.ts.map +1 -0
  41. package/dist/lib/core/__tests__/sign-actions.spec.js +128 -0
  42. package/dist/lib/core/__tests__/sign-actions.spec.js.map +1 -0
  43. package/dist/lib/core/__tests__/signer.spec.d.ts +2 -0
  44. package/dist/lib/core/__tests__/signer.spec.d.ts.map +1 -0
  45. package/dist/lib/core/__tests__/signer.spec.js +40 -0
  46. package/dist/lib/core/__tests__/signer.spec.js.map +1 -0
  47. package/dist/lib/core/context.d.ts +3 -2
  48. package/dist/lib/core/context.d.ts.map +1 -1
  49. package/dist/lib/core/context.js +3 -2
  50. package/dist/lib/core/context.js.map +1 -1
  51. package/dist/lib/core/engine.d.ts +4 -0
  52. package/dist/lib/core/engine.d.ts.map +1 -1
  53. package/dist/lib/core/engine.js +206 -0
  54. package/dist/lib/core/engine.js.map +1 -1
  55. package/dist/lib/core/loader.d.ts +1 -0
  56. package/dist/lib/core/loader.d.ts.map +1 -1
  57. package/dist/lib/core/loader.js +6 -1
  58. package/dist/lib/core/loader.js.map +1 -1
  59. package/dist/lib/core/resolver.d.ts +2 -0
  60. package/dist/lib/core/resolver.d.ts.map +1 -1
  61. package/dist/lib/core/resolver.js +89 -0
  62. package/dist/lib/core/resolver.js.map +1 -1
  63. package/dist/lib/core/signer.d.ts +7 -0
  64. package/dist/lib/core/signer.d.ts.map +1 -0
  65. package/dist/lib/core/signer.js +60 -0
  66. package/dist/lib/core/signer.js.map +1 -0
  67. package/dist/lib/deployer.d.ts.map +1 -1
  68. package/dist/lib/deployer.js +21 -4
  69. package/dist/lib/deployer.js.map +1 -1
  70. package/dist/lib/index.d.ts +1 -0
  71. package/dist/lib/index.d.ts.map +1 -1
  72. package/dist/lib/index.js +1 -0
  73. package/dist/lib/index.js.map +1 -1
  74. package/dist/lib/parsers/__tests__/job.spec.js +77 -0
  75. package/dist/lib/parsers/__tests__/job.spec.js.map +1 -1
  76. package/dist/lib/parsers/__tests__/source.spec.d.ts +2 -0
  77. package/dist/lib/parsers/__tests__/source.spec.d.ts.map +1 -0
  78. package/dist/lib/parsers/__tests__/source.spec.js +158 -0
  79. package/dist/lib/parsers/__tests__/source.spec.js.map +1 -0
  80. package/dist/lib/parsers/index.d.ts +1 -0
  81. package/dist/lib/parsers/index.d.ts.map +1 -1
  82. package/dist/lib/parsers/index.js +1 -0
  83. package/dist/lib/parsers/index.js.map +1 -1
  84. package/dist/lib/parsers/job.d.ts.map +1 -1
  85. package/dist/lib/parsers/job.js +11 -0
  86. package/dist/lib/parsers/job.js.map +1 -1
  87. package/dist/lib/parsers/source.d.ts +4 -0
  88. package/dist/lib/parsers/source.d.ts.map +1 -0
  89. package/dist/lib/parsers/source.js +107 -0
  90. package/dist/lib/parsers/source.js.map +1 -0
  91. package/dist/lib/provenance.d.ts +34 -0
  92. package/dist/lib/provenance.d.ts.map +1 -0
  93. package/dist/lib/provenance.js +694 -0
  94. package/dist/lib/provenance.js.map +1 -0
  95. package/dist/lib/types/actions.d.ts +42 -2
  96. package/dist/lib/types/actions.d.ts.map +1 -1
  97. package/dist/lib/types/actions.js +4 -0
  98. package/dist/lib/types/actions.js.map +1 -1
  99. package/dist/lib/types/contracts.d.ts +3 -0
  100. package/dist/lib/types/contracts.d.ts.map +1 -1
  101. package/dist/lib/types/definitions.d.ts +1 -0
  102. package/dist/lib/types/definitions.d.ts.map +1 -1
  103. package/dist/lib/types/index.d.ts +1 -0
  104. package/dist/lib/types/index.d.ts.map +1 -1
  105. package/dist/lib/types/index.js +1 -0
  106. package/dist/lib/types/index.js.map +1 -1
  107. package/dist/lib/types/source.d.ts +26 -0
  108. package/dist/lib/types/source.d.ts.map +1 -0
  109. package/dist/lib/types/source.js +3 -0
  110. package/dist/lib/types/source.js.map +1 -0
  111. package/dist/lib/types/values.d.ts +33 -1
  112. package/dist/lib/types/values.d.ts.map +1 -1
  113. package/package.json +4 -1
  114. package/.eslintrc.json +0 -29
  115. package/.github/workflows/ci.yml +0 -181
  116. package/CONCEPT.md +0 -24
  117. package/contracts/checked-call.huff +0 -65
  118. package/eslint.config.js +0 -48
  119. package/examples/jobs/guards-v1.yaml +0 -17
  120. package/examples/jobs/sequence-seq-0001-patch.yaml +0 -59
  121. package/examples/jobs/sequence-v1.yaml +0 -59
  122. package/examples/templates/sequence-factory-v1.yaml +0 -56
  123. package/jest.config.js +0 -25
  124. package/src/cli.ts +0 -17
  125. package/src/commands/common.ts +0 -61
  126. package/src/commands/dry.ts +0 -209
  127. package/src/commands/etherscan.ts +0 -360
  128. package/src/commands/index.ts +0 -5
  129. package/src/commands/list.ts +0 -249
  130. package/src/commands/run.ts +0 -146
  131. package/src/commands/utils.ts +0 -215
  132. package/src/index.ts +0 -67
  133. package/src/lib/__tests__/deployer-events.spec.ts +0 -338
  134. package/src/lib/__tests__/deployer.spec.ts +0 -2093
  135. package/src/lib/__tests__/network-loader.spec.ts +0 -150
  136. package/src/lib/__tests__/network-selection.spec.ts +0 -41
  137. package/src/lib/__tests__/network-utils.spec.ts +0 -230
  138. package/src/lib/artifacts/__tests__/fixtures/contract1.json +0 -19
  139. package/src/lib/artifacts/__tests__/fixtures/contract2.json +0 -19
  140. package/src/lib/artifacts/__tests__/fixtures/duplicate-name.json +0 -19
  141. package/src/lib/artifacts/__tests__/fixtures/nested/nested-contract.json +0 -18
  142. package/src/lib/artifacts/__tests__/fixtures/not-an-artifact.json +0 -8
  143. package/src/lib/artifacts/__tests__/fixtures/readme.txt +0 -2
  144. package/src/lib/contracts/__tests__/repository.spec.ts +0 -344
  145. package/src/lib/contracts/repository.ts +0 -313
  146. package/src/lib/core/__tests__/context.spec.ts +0 -37
  147. package/src/lib/core/__tests__/engine.spec.ts +0 -1889
  148. package/src/lib/core/__tests__/graph.spec.ts +0 -125
  149. package/src/lib/core/__tests__/json-integration.spec.ts +0 -425
  150. package/src/lib/core/__tests__/loader.spec.ts +0 -334
  151. package/src/lib/core/__tests__/multi-platform-verification.spec.ts +0 -406
  152. package/src/lib/core/__tests__/resolver.spec.ts +0 -2053
  153. package/src/lib/core/__tests__/static-action.spec.ts +0 -172
  154. package/src/lib/core/context.ts +0 -127
  155. package/src/lib/core/engine.ts +0 -1782
  156. package/src/lib/core/graph.ts +0 -252
  157. package/src/lib/core/loader.ts +0 -247
  158. package/src/lib/core/resolver.ts +0 -757
  159. package/src/lib/deployer.ts +0 -981
  160. package/src/lib/events/__tests__/event-system.spec.ts +0 -392
  161. package/src/lib/events/cli-adapter.ts +0 -369
  162. package/src/lib/events/emitter.ts +0 -62
  163. package/src/lib/events/index.ts +0 -3
  164. package/src/lib/events/types.ts +0 -520
  165. package/src/lib/index.ts +0 -14
  166. package/src/lib/network-loader.ts +0 -90
  167. package/src/lib/network-selection.ts +0 -73
  168. package/src/lib/network-utils.ts +0 -64
  169. package/src/lib/parsers/__tests__/buildinfo.spec.ts +0 -122
  170. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-bytecode-buildinfo.json +0 -62
  171. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-json.txt +0 -2
  172. package/src/lib/parsers/__tests__/fixtures/buildinfo/multi-contract-buildinfo.json +0 -89
  173. package/src/lib/parsers/__tests__/fixtures/buildinfo/no-contracts-buildinfo.json +0 -17
  174. package/src/lib/parsers/__tests__/fixtures/buildinfo/simple-buildinfo.json +0 -63
  175. package/src/lib/parsers/__tests__/fixtures/buildinfo/wrong-format.json +0 -4
  176. package/src/lib/parsers/__tests__/job.spec.ts +0 -358
  177. package/src/lib/parsers/__tests__/template.spec.ts +0 -111
  178. package/src/lib/parsers/artifact/__tests__/artifact.spec.ts +0 -117
  179. package/src/lib/parsers/artifact/__tests__/fixtures/empty-bytecode.json +0 -5
  180. package/src/lib/parsers/artifact/__tests__/fixtures/hardhat-artifact.json +0 -67
  181. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-bytecode.json +0 -5
  182. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-json.txt +0 -11
  183. package/src/lib/parsers/artifact/__tests__/fixtures/minimal-artifact.json +0 -5
  184. package/src/lib/parsers/artifact/__tests__/fixtures/missing-abi.json +0 -4
  185. package/src/lib/parsers/artifact/__tests__/fixtures/missing-bytecode.json +0 -11
  186. package/src/lib/parsers/artifact/__tests__/fixtures/missing-contract-name.json +0 -11
  187. package/src/lib/parsers/artifact/__tests__/fixtures/simple-artifact.json +0 -40
  188. package/src/lib/parsers/artifact/__tests__/fixtures/wrong-types.json +0 -7
  189. package/src/lib/parsers/artifact/foundry-1.2.ts +0 -72
  190. package/src/lib/parsers/artifact/index.ts +0 -27
  191. package/src/lib/parsers/artifact/types.ts +0 -9
  192. package/src/lib/parsers/buildinfo.ts +0 -127
  193. package/src/lib/parsers/constants.ts +0 -56
  194. package/src/lib/parsers/index.ts +0 -5
  195. package/src/lib/parsers/job.ts +0 -148
  196. package/src/lib/parsers/template.ts +0 -135
  197. package/src/lib/std/templates/arachnid-deterministic-deployment-proxy.yaml +0 -68
  198. package/src/lib/std/templates/assured-deployment.yaml +0 -46
  199. package/src/lib/std/templates/era-evm-predeploy.yaml +0 -35
  200. package/src/lib/std/templates/erc-2470.yaml +0 -70
  201. package/src/lib/std/templates/min-balance.yaml +0 -35
  202. package/src/lib/std/templates/nano-universal-deployer.yaml +0 -61
  203. package/src/lib/std/templates/raw-erc-2470.yaml +0 -62
  204. package/src/lib/std/templates/raw-nano-universal-deployer.yaml +0 -54
  205. package/src/lib/std/templates/raw-sequence-universal-deployer-2.yaml +0 -52
  206. package/src/lib/std/templates/sequence-universal-deployer-2.yaml +0 -61
  207. package/src/lib/types/__tests__/json-request-action.spec.ts +0 -243
  208. package/src/lib/types/__tests__/read-json-value.spec.ts +0 -278
  209. package/src/lib/types/__tests__/resolve-json-value.spec.ts +0 -769
  210. package/src/lib/types/actions.ts +0 -127
  211. package/src/lib/types/artifacts.ts +0 -21
  212. package/src/lib/types/buildinfo.ts +0 -116
  213. package/src/lib/types/conditions.ts +0 -50
  214. package/src/lib/types/contracts.ts +0 -23
  215. package/src/lib/types/definitions.ts +0 -70
  216. package/src/lib/types/index.ts +0 -8
  217. package/src/lib/types/network.ts +0 -33
  218. package/src/lib/types/project.ts +0 -9
  219. package/src/lib/types/task.ts +0 -9
  220. package/src/lib/types/values.ts +0 -150
  221. package/src/lib/utils/assertion.ts +0 -24
  222. package/src/lib/utils/validation.ts +0 -116
  223. package/src/lib/validation/contract-references.ts +0 -210
  224. package/src/lib/validation/index.ts +0 -1
  225. package/src/lib/verification/__tests__/etherscan.spec.ts +0 -710
  226. package/src/lib/verification/__tests__/sourcify.spec.ts +0 -288
  227. package/src/lib/verification/etherscan.ts +0 -547
  228. package/src/lib/verification/sourcify.ts +0 -248
  229. package/test_validation/artifacts/TestContract.json +0 -9
  230. package/test_validation/jobs/test-missing.yaml +0 -16
  231. package/test_validation/networks.yaml +0 -3
  232. package/tsconfig.json +0 -36
@@ -1,150 +0,0 @@
1
- import * as fs from 'fs/promises'
2
- import * as path from 'path'
3
- import { loadNetworks } from '../network-loader'
4
-
5
- const tmpDir = path.join(process.cwd(), '.tmp-network-loader-tests')
6
-
7
- async function writeNetworksYaml(projectRoot: string, yamlContent: string): Promise<void> {
8
- await fs.mkdir(projectRoot, { recursive: true })
9
- await fs.writeFile(path.join(projectRoot, 'networks.yaml'), yamlContent, 'utf-8')
10
- }
11
-
12
- describe('network-loader rpcUrl token replacement', () => {
13
- const originalEnv = { ...process.env }
14
-
15
- beforeAll(async () => {
16
- await fs.mkdir(tmpDir, { recursive: true })
17
- })
18
-
19
- afterEach(() => {
20
- process.env = { ...originalEnv }
21
- })
22
-
23
- afterAll(async () => {
24
- try {
25
- await fs.rm(tmpDir, { recursive: true, force: true })
26
- } catch {}
27
- })
28
-
29
- test('replaces {{RPC_*}} tokens with env values', async () => {
30
- const projectRoot = path.join(tmpDir, 'case1')
31
- process.env.RPC_URL_TOKEN = 'abc123'
32
- const yaml = `
33
- - name: "TestNet"
34
- chainId: 123
35
- rpcUrl: "https://node.example.com/{{RPC_URL_TOKEN}}"
36
- `
37
- await writeNetworksYaml(projectRoot, yaml)
38
-
39
- const networks = await loadNetworks(projectRoot)
40
- expect(networks).toHaveLength(1)
41
- expect(networks[0].rpcUrl).toBe('https://node.example.com/abc123')
42
- })
43
-
44
- test('leaves non-RPC tokens intact', async () => {
45
- const projectRoot = path.join(tmpDir, 'case2')
46
- process.env.SOME_TOKEN = 'should_not_be_used'
47
- const yaml = `
48
- - name: "TestNet"
49
- chainId: 123
50
- rpcUrl: "https://node.example.com/{{SOME_TOKEN}}"
51
- `
52
- await writeNetworksYaml(projectRoot, yaml)
53
-
54
- const networks = await loadNetworks(projectRoot)
55
- expect(networks[0].rpcUrl).toBe('https://node.example.com/{{SOME_TOKEN}}')
56
- })
57
-
58
- test('supports multiple RPC tokens in a single url', async () => {
59
- const projectRoot = path.join(tmpDir, 'case3')
60
- process.env.RPC_A = 'A'
61
- process.env.RPC_B = 'B'
62
- const yaml = `
63
- - name: "TestNet"
64
- chainId: 123
65
- rpcUrl: "https://node.example.com/{{RPC_A}}/path/{{RPC_B}}"
66
- `
67
- await writeNetworksYaml(projectRoot, yaml)
68
-
69
- const networks = await loadNetworks(projectRoot)
70
- expect(networks[0].rpcUrl).toBe('https://node.example.com/A/path/B')
71
- })
72
-
73
- test('trims whitespace within tokens', async () => {
74
- const projectRoot = path.join(tmpDir, 'case4')
75
- process.env.RPC_TOKEN = 'XYZ'
76
- const yaml = `
77
- - name: "TestNet"
78
- chainId: 123
79
- rpcUrl: "https://node.example.com/{{ RPC_TOKEN }}"
80
- `
81
- await writeNetworksYaml(projectRoot, yaml)
82
-
83
- const networks = await loadNetworks(projectRoot)
84
- expect(networks[0].rpcUrl).toBe('https://node.example.com/XYZ')
85
- })
86
-
87
- test('defaults to empty string when RPC token has no matching env var', async () => {
88
- const projectRoot = path.join(tmpDir, 'case5')
89
- delete process.env.RPC_MISSING
90
- const yaml = `
91
- - name: "TestNet"
92
- chainId: 123
93
- rpcUrl: "https://node.example.com/{{RPC_MISSING}}"
94
- `
95
- await writeNetworksYaml(projectRoot, yaml)
96
-
97
- const networks = await loadNetworks(projectRoot)
98
- expect(networks[0].rpcUrl).toBe('https://node.example.com/')
99
- })
100
- })
101
-
102
- describe('network-loader params', () => {
103
- afterAll(async () => {
104
- try {
105
- await fs.rm(tmpDir, { recursive: true, force: true })
106
- } catch {}
107
- })
108
-
109
- test('passes through valid params object', async () => {
110
- const projectRoot = path.join(tmpDir, 'params-valid')
111
- const yaml = `
112
- - name: "MyNet"
113
- chainId: 4217
114
- rpcUrl: "http://127.0.0.1:8545"
115
- params:
116
- myParam: true
117
- `
118
- await writeNetworksYaml(projectRoot, yaml)
119
-
120
- const networks = await loadNetworks(projectRoot)
121
- expect(networks).toHaveLength(1)
122
- expect(networks[0].params).toEqual({ myParam: true })
123
- })
124
-
125
- test('rejects params when not a plain object', async () => {
126
- const projectRoot = path.join(tmpDir, 'params-invalid-array')
127
- const yaml = `
128
- - name: "BadNet"
129
- chainId: 1
130
- rpcUrl: "http://127.0.0.1:8545"
131
- params: [1, 2, 3]
132
- `
133
- await writeNetworksYaml(projectRoot, yaml)
134
-
135
- await expect(loadNetworks(projectRoot)).rejects.toThrow(/Failed to load or parse networks.yaml/)
136
- })
137
-
138
- test('rejects params when null', async () => {
139
- const projectRoot = path.join(tmpDir, 'params-invalid-null')
140
- const yaml = `
141
- - name: "BadNet"
142
- chainId: 1
143
- rpcUrl: "http://127.0.0.1:8545"
144
- params: null
145
- `
146
- await writeNetworksYaml(projectRoot, yaml)
147
-
148
- await expect(loadNetworks(projectRoot)).rejects.toThrow(/Failed to load or parse networks.yaml/)
149
- })
150
- })
@@ -1,41 +0,0 @@
1
- import { resolveSelectedChainIds, resolveSingleChainId } from '../../lib/network-selection'
2
- import { Network } from '../../lib/types'
3
-
4
- describe('network-selection', () => {
5
- const networks: Network[] = [
6
- { name: 'Mainnet', chainId: 1, rpcUrl: 'https://mainnet' },
7
- { name: 'Arbitrum One', chainId: 42161, rpcUrl: 'https://arb' },
8
- { name: 'Polygon', chainId: 137, rpcUrl: 'https://polygon' },
9
- { name: 'Mainnet', chainId: 10_000, rpcUrl: 'https://fork' },
10
- ]
11
-
12
- it('returns undefined for empty/undefined input', () => {
13
- expect(resolveSelectedChainIds(undefined, networks)).toBeUndefined()
14
- expect(resolveSelectedChainIds('', networks)).toBeUndefined()
15
- expect(resolveSelectedChainIds(' ', networks)).toBeUndefined()
16
- })
17
-
18
- it('parses numeric IDs and removes duplicates', () => {
19
- expect(resolveSelectedChainIds('1,1,42161', networks)).toEqual([1, 42161])
20
- })
21
-
22
- it('matches names case-insensitively and includes all with same name', () => {
23
- expect(resolveSelectedChainIds('mainnet', networks)).toEqual([1, 10000])
24
- expect(resolveSelectedChainIds('MAINNET,polygon', networks)).toEqual([1, 10000, 137])
25
- })
26
-
27
- it('preserves token order and then network order for name matches', () => {
28
- expect(resolveSelectedChainIds('polygon,mainnet', networks)).toEqual([137, 1, 10000])
29
- })
30
-
31
- it('throws on unknown name', () => {
32
- expect(() => resolveSelectedChainIds('unknown', networks)).toThrow(/Unknown network selector/)
33
- })
34
-
35
- it('resolveSingleChainId returns first match for name and first token for multi', () => {
36
- expect(resolveSingleChainId('mainnet', networks)).toBe(1)
37
- expect(resolveSingleChainId('137,1', networks)).toBe(137)
38
- })
39
- })
40
-
41
-
@@ -1,230 +0,0 @@
1
- import { detectNetworkFromRpc, isValidRpcUrl } from '../network-utils'
2
- import { Network } from '../types'
3
-
4
- // Mock ethers.JsonRpcProvider
5
- jest.mock('ethers', () => ({
6
- ...jest.requireActual('ethers'),
7
- ethers: {
8
- ...jest.requireActual('ethers').ethers,
9
- JsonRpcProvider: jest.fn().mockImplementation(() => ({
10
- getNetwork: jest.fn()
11
- }))
12
- }
13
- }))
14
-
15
- describe('Network Utils', () => {
16
- describe('isValidRpcUrl', () => {
17
- it('should validate valid HTTP RPC URLs', () => {
18
- expect(isValidRpcUrl('http://localhost:8545')).toBe(true)
19
- expect(isValidRpcUrl('https://mainnet.infura.io/v3/abc123')).toBe(true)
20
- })
21
-
22
- it('should validate valid WebSocket RPC URLs', () => {
23
- expect(isValidRpcUrl('ws://localhost:8545')).toBe(true)
24
- expect(isValidRpcUrl('wss://mainnet.infura.io/v3/abc123')).toBe(true)
25
- })
26
-
27
- it('should reject invalid URLs', () => {
28
- expect(isValidRpcUrl('invalid-url')).toBe(false)
29
- expect(isValidRpcUrl('ftp://example.com')).toBe(false)
30
- expect(isValidRpcUrl('')).toBe(false)
31
- })
32
-
33
- it('should reject URLs without hostname', () => {
34
- expect(isValidRpcUrl('http://')).toBe(false)
35
- })
36
- })
37
-
38
- describe('detectNetworkFromRpc', () => {
39
- let mockGetNetwork: jest.Mock
40
-
41
- beforeEach(() => {
42
- // Reset mocks
43
- jest.clearAllMocks()
44
-
45
- // Mock the JsonRpcProvider constructor and getNetwork method
46
- const { ethers } = require('ethers')
47
- mockGetNetwork = jest.fn()
48
-
49
- // Mock the provider's getNetwork method
50
- ethers.JsonRpcProvider.mockImplementation(() => ({
51
- getNetwork: mockGetNetwork
52
- }))
53
- })
54
-
55
- it('should detect network successfully', async () => {
56
- const mockNetwork = {
57
- name: 'mainnet',
58
- chainId: 1
59
- }
60
-
61
- mockGetNetwork.mockResolvedValue(mockNetwork)
62
-
63
- const result = await detectNetworkFromRpc('https://mainnet.infura.io/v3/abc123')
64
-
65
- expect(result).toEqual({
66
- name: 'mainnet',
67
- chainId: 1,
68
- rpcUrl: 'https://mainnet.infura.io/v3/abc123'
69
- })
70
-
71
- // Verify provider was created with correct URL
72
- const { ethers } = require('ethers')
73
- expect(ethers.JsonRpcProvider).toHaveBeenCalledWith('https://mainnet.infura.io/v3/abc123')
74
- })
75
-
76
- it('should handle network with unknown name', async () => {
77
- const mockNetwork = {
78
- name: 'unknown',
79
- chainId: 31337
80
- }
81
-
82
- mockGetNetwork.mockResolvedValue(mockNetwork)
83
-
84
- const result = await detectNetworkFromRpc('http://localhost:8545')
85
-
86
- expect(result).toEqual({
87
- name: 'unknown',
88
- chainId: 31337,
89
- rpcUrl: 'http://localhost:8545'
90
- })
91
- })
92
-
93
- it('should handle connection errors', async () => {
94
- mockGetNetwork.mockRejectedValue(new Error('Connection failed'))
95
-
96
- await expect(detectNetworkFromRpc('http://localhost:8545'))
97
- .rejects.toThrow('Failed to detect network from RPC URL "http://localhost:8545": Connection failed')
98
- })
99
-
100
- it('should handle network detection errors', async () => {
101
- mockGetNetwork.mockRejectedValue(new Error('Network not supported'))
102
-
103
- await expect(detectNetworkFromRpc('http://invalid-rpc.com'))
104
- .rejects.toThrow('Failed to detect network from RPC URL "http://invalid-rpc.com": Network not supported')
105
- })
106
- })
107
-
108
- describe('Integration with Run Command', () => {
109
- it('should create a complete Network object from detected information', async () => {
110
- const { ethers } = require('ethers')
111
-
112
- const mockNetwork = {
113
- name: 'sepolia',
114
- chainId: 11155111,
115
- }
116
-
117
- const getNetworkMock = jest.fn().mockResolvedValue(mockNetwork)
118
- ethers.JsonRpcProvider.mockImplementation(() => ({
119
- getNetwork: getNetworkMock,
120
- }))
121
-
122
- const detectedInfo = await detectNetworkFromRpc('https://sepolia.infura.io/v3/abc123')
123
-
124
- // Simulate what the run command does
125
- const customNetwork: Network = {
126
- name: detectedInfo.name || `custom-${detectedInfo.chainId}`,
127
- chainId: detectedInfo.chainId!,
128
- rpcUrl: 'https://sepolia.infura.io/v3/abc123',
129
- supports: detectedInfo.supports || [],
130
- gasLimit: detectedInfo.gasLimit,
131
- testnet: detectedInfo.testnet,
132
- evmVersion: detectedInfo.evmVersion,
133
- params: detectedInfo.params,
134
- }
135
-
136
- expect(customNetwork).toEqual({
137
- name: 'sepolia',
138
- chainId: 11155111,
139
- rpcUrl: 'https://sepolia.infura.io/v3/abc123',
140
- supports: [],
141
- gasLimit: undefined,
142
- testnet: undefined,
143
- evmVersion: undefined,
144
- params: undefined,
145
- })
146
- })
147
-
148
- it('should merge params and other yaml fields when chainId matches networks.yaml', async () => {
149
- const { ethers } = require('ethers')
150
-
151
- const getNetworkMock = jest.fn().mockResolvedValue({ name: 'unknown', chainId: 137 })
152
- ethers.JsonRpcProvider.mockImplementation(() => ({
153
- getNetwork: getNetworkMock,
154
- }))
155
-
156
- const detectedInfo = await detectNetworkFromRpc('http://127.0.0.1:8545')
157
- const knownNetwork: Network = {
158
- name: 'Polygon',
159
- chainId: 137,
160
- rpcUrl: 'https://nodes.sequence.app/polygon/token',
161
- supports: ['etherscan_v2', 'sourcify'],
162
- testnet: false,
163
- evmVersion: 'paris',
164
- params: { trailsOnly: false },
165
- }
166
-
167
- // Simulate what the run command does
168
- const customNetwork: Network = {
169
- name: detectedInfo.name || knownNetwork.name || `custom-${detectedInfo.chainId}`,
170
- chainId: detectedInfo.chainId!,
171
- rpcUrl: 'http://127.0.0.1:8545',
172
- supports: detectedInfo.supports || knownNetwork.supports || [],
173
- gasLimit: detectedInfo.gasLimit || knownNetwork.gasLimit,
174
- testnet: detectedInfo.testnet !== undefined ? detectedInfo.testnet : knownNetwork.testnet,
175
- evmVersion: detectedInfo.evmVersion || knownNetwork.evmVersion,
176
- params: detectedInfo.params || knownNetwork.params,
177
- }
178
-
179
- expect(customNetwork).toEqual({
180
- name: 'unknown',
181
- chainId: 137,
182
- rpcUrl: 'http://127.0.0.1:8545',
183
- supports: ['etherscan_v2', 'sourcify'],
184
- gasLimit: undefined,
185
- testnet: false,
186
- evmVersion: 'paris',
187
- params: { trailsOnly: false },
188
- })
189
- })
190
-
191
- it('should handle partial network information gracefully', async () => {
192
- const { ethers } = require('ethers')
193
-
194
- const mockNetwork = {
195
- name: 'unknown',
196
- chainId: 42,
197
- }
198
-
199
- const getNetworkMock = jest.fn().mockResolvedValue(mockNetwork)
200
- ethers.JsonRpcProvider.mockImplementation(() => ({
201
- getNetwork: getNetworkMock,
202
- }))
203
-
204
- const detectedInfo = await detectNetworkFromRpc('http://custom-network:8545')
205
-
206
- // Simulate what the run command does
207
- const customNetwork: Network = {
208
- name: detectedInfo.name || `custom-${detectedInfo.chainId}`,
209
- chainId: detectedInfo.chainId!,
210
- rpcUrl: 'http://custom-network:8545',
211
- supports: detectedInfo.supports || [],
212
- gasLimit: detectedInfo.gasLimit,
213
- testnet: detectedInfo.testnet,
214
- evmVersion: detectedInfo.evmVersion,
215
- params: detectedInfo.params,
216
- }
217
-
218
- expect(customNetwork).toEqual({
219
- name: 'unknown',
220
- chainId: 42,
221
- rpcUrl: 'http://custom-network:8545',
222
- supports: [],
223
- gasLimit: undefined,
224
- testnet: undefined,
225
- evmVersion: undefined,
226
- params: undefined,
227
- })
228
- })
229
- })
230
- })
@@ -1,19 +0,0 @@
1
- {
2
- "contractName": "TestContract1",
3
- "sourceName": "contracts/TestContract1.sol",
4
- "abi": [
5
- {
6
- "type": "function",
7
- "name": "getValue",
8
- "inputs": [],
9
- "outputs": [
10
- {
11
- "name": "",
12
- "type": "uint256"
13
- }
14
- ]
15
- }
16
- ],
17
- "bytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806320965255146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b0000005b6000806000fefe",
18
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806320965255146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b6000fefe"
19
- }
@@ -1,19 +0,0 @@
1
- {
2
- "contractName": "TestContract2",
3
- "sourceName": "contracts/TestContract2.sol",
4
- "abi": [
5
- {
6
- "type": "function",
7
- "name": "setValue",
8
- "inputs": [
9
- {
10
- "name": "value",
11
- "type": "uint256"
12
- }
13
- ],
14
- "outputs": []
15
- }
16
- ],
17
- "bytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806355241077146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b6000fefe",
18
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806355241077146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b6000fefe"
19
- }
@@ -1,19 +0,0 @@
1
- {
2
- "contractName": "TestContract1",
3
- "sourceName": "contracts/DuplicateTestContract1.sol",
4
- "abi": [
5
- {
6
- "type": "function",
7
- "name": "differentFunction",
8
- "inputs": [],
9
- "outputs": [
10
- {
11
- "name": "",
12
- "type": "string"
13
- }
14
- ]
15
- }
16
- ],
17
- "bytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806320965255146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b0000005b6000806000fefe",
18
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806320965255146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b6000fefe"
19
- }
@@ -1,18 +0,0 @@
1
- {
2
- "contractName": "NestedContract",
3
- "sourceName": "contracts/nested/NestedContract.sol",
4
- "abi": [
5
- {
6
- "type": "function",
7
- "name": "nestedFunction",
8
- "inputs": [],
9
- "outputs": [
10
- {
11
- "name": "",
12
- "type": "bool"
13
- }
14
- ]
15
- }
16
- ],
17
- "bytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806320965255146100365780636d4ce63c14610040575b600080fd5b610040610058565b005b610048610062565b6040516100579190610078565b60405180910390f35b0000005b6000806000fefe"
18
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "NotAnArtifact",
3
- "data": {
4
- "some": "random",
5
- "json": "data"
6
- },
7
- "version": "1.0.0"
8
- }
@@ -1,2 +0,0 @@
1
- This is just a text file that should be ignored during artifact scanning.
2
- It has no JSON content and should not interfere with the test.