@maci-protocol/coordinator 0.0.0-ci.e3476db → 0.0.0-ci.e3bcdf9

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 (234) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +71 -10
  3. package/build/hardhat.config.cjs +17 -9
  4. package/build/hardhat.config.cjs.map +1 -1
  5. package/build/hardhat.config.d.cts +15 -12
  6. package/build/hardhat.config.d.cts.map +1 -1
  7. package/build/scripts/generateKeypair.js +2 -2
  8. package/build/scripts/generateKeypair.js.map +1 -1
  9. package/build/scripts/generateMaciKeyPair.js +2 -2
  10. package/build/scripts/generateMaciKeyPair.js.map +1 -1
  11. package/build/tests/constants.d.ts +3 -4
  12. package/build/tests/constants.d.ts.map +1 -1
  13. package/build/tests/constants.js +5 -4
  14. package/build/tests/constants.js.map +1 -1
  15. package/build/tests/e2e.deploy.test.js +132 -102
  16. package/build/tests/e2e.deploy.test.js.map +1 -1
  17. package/build/tests/e2e.redis.test.d.ts +2 -0
  18. package/build/tests/e2e.redis.test.d.ts.map +1 -0
  19. package/build/tests/e2e.redis.test.js +118 -0
  20. package/build/tests/e2e.redis.test.js.map +1 -0
  21. package/build/tests/utils.d.ts +7 -1
  22. package/build/tests/utils.d.ts.map +1 -1
  23. package/build/tests/utils.js +17 -6
  24. package/build/tests/utils.js.map +1 -1
  25. package/build/ts/app.module.d.ts.map +1 -1
  26. package/build/ts/app.module.js +6 -0
  27. package/build/ts/app.module.js.map +1 -1
  28. package/build/ts/common/__tests__/common.test.js +44 -46
  29. package/build/ts/common/__tests__/common.test.js.map +1 -1
  30. package/build/ts/common/accountAbstraction.d.ts +7 -24
  31. package/build/ts/common/accountAbstraction.d.ts.map +1 -1
  32. package/build/ts/common/accountAbstraction.js +22 -49
  33. package/build/ts/common/accountAbstraction.js.map +1 -1
  34. package/build/ts/common/chain.d.ts +22 -0
  35. package/build/ts/common/chain.d.ts.map +1 -0
  36. package/build/ts/common/chain.js +37 -0
  37. package/build/ts/common/chain.js.map +1 -0
  38. package/build/ts/common/coordinatorKeypair.d.ts +7 -0
  39. package/build/ts/common/coordinatorKeypair.d.ts.map +1 -0
  40. package/build/ts/common/coordinatorKeypair.js +14 -0
  41. package/build/ts/common/coordinatorKeypair.js.map +1 -0
  42. package/build/ts/common/errors.d.ts +13 -10
  43. package/build/ts/common/errors.d.ts.map +1 -1
  44. package/build/ts/common/errors.js +12 -9
  45. package/build/ts/common/errors.js.map +1 -1
  46. package/build/ts/common/http.d.ts +6 -0
  47. package/build/ts/common/http.d.ts.map +1 -0
  48. package/build/ts/common/http.js +49 -0
  49. package/build/ts/common/http.js.map +1 -0
  50. package/build/ts/common/index.d.ts +3 -1
  51. package/build/ts/common/index.d.ts.map +1 -1
  52. package/build/ts/common/index.js +3 -1
  53. package/build/ts/common/index.js.map +1 -1
  54. package/build/ts/common/networks.d.ts +2 -21
  55. package/build/ts/common/networks.d.ts.map +1 -1
  56. package/build/ts/common/networks.js +39 -48
  57. package/build/ts/common/networks.js.map +1 -1
  58. package/build/ts/common/types.d.ts +3 -4
  59. package/build/ts/common/types.d.ts.map +1 -1
  60. package/build/ts/deployer/__tests__/deployer.controller.test.js +23 -25
  61. package/build/ts/deployer/__tests__/deployer.controller.test.js.map +1 -1
  62. package/build/ts/deployer/__tests__/deployer.service.test.js +184 -337
  63. package/build/ts/deployer/__tests__/deployer.service.test.js.map +1 -1
  64. package/build/ts/deployer/__tests__/utils.d.ts +31 -6
  65. package/build/ts/deployer/__tests__/utils.d.ts.map +1 -1
  66. package/build/ts/deployer/__tests__/utils.js +48 -22
  67. package/build/ts/deployer/__tests__/utils.js.map +1 -1
  68. package/build/ts/deployer/deployer.controller.d.ts.map +1 -1
  69. package/build/ts/deployer/deployer.controller.js +19 -6
  70. package/build/ts/deployer/deployer.controller.js.map +1 -1
  71. package/build/ts/deployer/deployer.service.d.ts +26 -53
  72. package/build/ts/deployer/deployer.service.d.ts.map +1 -1
  73. package/build/ts/deployer/deployer.service.js +345 -454
  74. package/build/ts/deployer/deployer.service.js.map +1 -1
  75. package/build/ts/deployer/dto.d.ts +7 -7
  76. package/build/ts/deployer/dto.d.ts.map +1 -1
  77. package/build/ts/deployer/dto.js +14 -6
  78. package/build/ts/deployer/dto.js.map +1 -1
  79. package/build/ts/deployer/types.d.ts +103 -45
  80. package/build/ts/deployer/types.d.ts.map +1 -1
  81. package/build/ts/file/__tests__/file.service.test.js +12 -11
  82. package/build/ts/file/__tests__/file.service.test.js.map +1 -1
  83. package/build/ts/file/file.service.d.ts +4 -3
  84. package/build/ts/file/file.service.d.ts.map +1 -1
  85. package/build/ts/file/file.service.js +16 -10
  86. package/build/ts/file/file.service.js.map +1 -1
  87. package/build/ts/file/types.d.ts +2 -2
  88. package/build/ts/file/types.d.ts.map +1 -1
  89. package/build/ts/health/__tests__/health.controller.test.d.ts +2 -0
  90. package/build/ts/health/__tests__/health.controller.test.d.ts.map +1 -0
  91. package/build/ts/health/__tests__/health.controller.test.js +52 -0
  92. package/build/ts/health/__tests__/health.controller.test.js.map +1 -0
  93. package/build/ts/health/__tests__/health.service.test.d.ts +2 -0
  94. package/build/ts/health/__tests__/health.service.test.d.ts.map +1 -0
  95. package/build/ts/health/__tests__/health.service.test.js +101 -0
  96. package/build/ts/health/__tests__/health.service.test.js.map +1 -0
  97. package/build/ts/health/health.controller.d.ts +16 -0
  98. package/build/ts/health/health.controller.d.ts.map +1 -0
  99. package/build/ts/health/health.controller.js +43 -0
  100. package/build/ts/health/health.controller.js.map +1 -0
  101. package/build/ts/health/health.module.d.ts +3 -0
  102. package/build/ts/health/health.module.d.ts.map +1 -0
  103. package/build/ts/health/health.module.js +22 -0
  104. package/build/ts/health/health.module.js.map +1 -0
  105. package/build/ts/health/health.service.d.ts +42 -0
  106. package/build/ts/health/health.service.d.ts.map +1 -0
  107. package/build/ts/health/health.service.js +176 -0
  108. package/build/ts/health/health.service.js.map +1 -0
  109. package/build/ts/health/types.d.ts +87 -0
  110. package/build/ts/health/types.d.ts.map +1 -0
  111. package/build/ts/health/types.js +2 -0
  112. package/build/ts/health/types.js.map +1 -0
  113. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts +11 -0
  114. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts.map +1 -0
  115. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js +12 -0
  116. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js.map +1 -0
  117. package/build/ts/main.js +1 -1
  118. package/build/ts/proof/__tests__/proof.controller.test.js +8 -7
  119. package/build/ts/proof/__tests__/proof.controller.test.js.map +1 -1
  120. package/build/ts/proof/__tests__/proof.gateway.test.js +5 -3
  121. package/build/ts/proof/__tests__/proof.gateway.test.js.map +1 -1
  122. package/build/ts/proof/__tests__/proof.service.test.js +31 -75
  123. package/build/ts/proof/__tests__/proof.service.test.js.map +1 -1
  124. package/build/ts/proof/dto.d.ts +15 -18
  125. package/build/ts/proof/dto.d.ts.map +1 -1
  126. package/build/ts/proof/dto.js +55 -49
  127. package/build/ts/proof/dto.js.map +1 -1
  128. package/build/ts/proof/proof.controller.d.ts +3 -2
  129. package/build/ts/proof/proof.controller.d.ts.map +1 -1
  130. package/build/ts/proof/proof.controller.js +38 -15
  131. package/build/ts/proof/proof.controller.js.map +1 -1
  132. package/build/ts/proof/proof.module.d.ts.map +1 -1
  133. package/build/ts/proof/proof.module.js +1 -0
  134. package/build/ts/proof/proof.module.js.map +1 -1
  135. package/build/ts/proof/proof.service.d.ts +4 -6
  136. package/build/ts/proof/proof.service.d.ts.map +1 -1
  137. package/build/ts/proof/proof.service.js +48 -130
  138. package/build/ts/proof/proof.service.js.map +1 -1
  139. package/build/ts/proof/types.d.ts +21 -17
  140. package/build/ts/proof/types.d.ts.map +1 -1
  141. package/build/ts/proof/types.js.map +1 -1
  142. package/build/ts/redis/__tests__/redis.service.test.d.ts +2 -0
  143. package/build/ts/redis/__tests__/redis.service.test.d.ts.map +1 -0
  144. package/build/ts/redis/__tests__/redis.service.test.js +148 -0
  145. package/build/ts/redis/__tests__/redis.service.test.js.map +1 -0
  146. package/build/ts/redis/redis.module.d.ts +3 -0
  147. package/build/ts/redis/redis.module.d.ts.map +1 -0
  148. package/build/ts/redis/redis.module.js +18 -0
  149. package/build/ts/redis/redis.module.js.map +1 -0
  150. package/build/ts/redis/redis.service.d.ts +53 -0
  151. package/build/ts/redis/redis.service.d.ts.map +1 -0
  152. package/build/ts/redis/redis.service.js +99 -0
  153. package/build/ts/redis/redis.service.js.map +1 -0
  154. package/build/ts/redis/types.d.ts +66 -0
  155. package/build/ts/redis/types.d.ts.map +1 -0
  156. package/build/ts/redis/types.js +2 -0
  157. package/build/ts/redis/types.js.map +1 -0
  158. package/build/ts/redis/utils.d.ts +20 -0
  159. package/build/ts/redis/utils.d.ts.map +1 -0
  160. package/build/ts/redis/utils.js +27 -0
  161. package/build/ts/redis/utils.js.map +1 -0
  162. package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts +2 -0
  163. package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts.map +1 -0
  164. package/build/ts/scheduler/__tests__/scheduler.controller.test.js +62 -0
  165. package/build/ts/scheduler/__tests__/scheduler.controller.test.js.map +1 -0
  166. package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts +2 -0
  167. package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts.map +1 -0
  168. package/build/ts/scheduler/__tests__/scheduler.service.test.js +369 -0
  169. package/build/ts/scheduler/__tests__/scheduler.service.test.js.map +1 -0
  170. package/build/ts/scheduler/dto.d.ts +41 -0
  171. package/build/ts/scheduler/dto.d.ts.map +1 -0
  172. package/build/ts/scheduler/dto.js +115 -0
  173. package/build/ts/scheduler/dto.js.map +1 -0
  174. package/build/ts/scheduler/scheduler.controller.d.ts +32 -0
  175. package/build/ts/scheduler/scheduler.controller.d.ts.map +1 -0
  176. package/build/ts/scheduler/scheduler.controller.js +118 -0
  177. package/build/ts/scheduler/scheduler.controller.js.map +1 -0
  178. package/build/ts/scheduler/scheduler.module.d.ts +3 -0
  179. package/build/ts/scheduler/scheduler.module.d.ts.map +1 -0
  180. package/build/ts/scheduler/scheduler.module.js +24 -0
  181. package/build/ts/scheduler/scheduler.module.js.map +1 -0
  182. package/build/ts/scheduler/scheduler.service.d.ts +71 -0
  183. package/build/ts/scheduler/scheduler.service.d.ts.map +1 -0
  184. package/build/ts/scheduler/scheduler.service.js +297 -0
  185. package/build/ts/scheduler/scheduler.service.js.map +1 -0
  186. package/build/ts/scheduler/types.d.ts +65 -0
  187. package/build/ts/scheduler/types.d.ts.map +1 -0
  188. package/build/ts/scheduler/types.js +2 -0
  189. package/build/ts/scheduler/types.js.map +1 -0
  190. package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js +2 -2
  191. package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js.map +1 -1
  192. package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js +34 -19
  193. package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js.map +1 -1
  194. package/build/ts/sessionKeys/__tests__/utils.d.ts +1 -1
  195. package/build/ts/sessionKeys/__tests__/utils.d.ts.map +1 -1
  196. package/build/ts/sessionKeys/__tests__/utils.js +7 -6
  197. package/build/ts/sessionKeys/__tests__/utils.js.map +1 -1
  198. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts +53 -0
  199. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts.map +1 -0
  200. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.js +105 -0
  201. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.js.map +1 -0
  202. package/build/ts/sessionKeys/sessionKeys.service.d.ts +16 -4
  203. package/build/ts/sessionKeys/sessionKeys.service.d.ts.map +1 -1
  204. package/build/ts/sessionKeys/sessionKeys.service.js +23 -6
  205. package/build/ts/sessionKeys/sessionKeys.service.js.map +1 -1
  206. package/build/ts/subgraph/__tests__/subgraph.controller.test.js +3 -3
  207. package/build/ts/subgraph/__tests__/subgraph.controller.test.js.map +1 -1
  208. package/build/ts/subgraph/__tests__/subgraph.gateway.test.js +2 -2
  209. package/build/ts/subgraph/__tests__/subgraph.gateway.test.js.map +1 -1
  210. package/build/ts/subgraph/__tests__/subgraph.service.test.js +5 -5
  211. package/build/ts/subgraph/__tests__/subgraph.service.test.js.map +1 -1
  212. package/build/ts/subgraph/dto.d.ts +2 -2
  213. package/build/ts/subgraph/dto.d.ts.map +1 -1
  214. package/build/ts/subgraph/dto.js +3 -3
  215. package/build/ts/subgraph/dto.js.map +1 -1
  216. package/build/ts/subgraph/subgraph.controller.d.ts.map +1 -1
  217. package/build/ts/subgraph/subgraph.controller.js +8 -3
  218. package/build/ts/subgraph/subgraph.controller.js.map +1 -1
  219. package/build/ts/subgraph/subgraph.service.d.ts +4 -0
  220. package/build/ts/subgraph/subgraph.service.d.ts.map +1 -1
  221. package/build/ts/subgraph/subgraph.service.js +23 -10
  222. package/build/ts/subgraph/subgraph.service.js.map +1 -1
  223. package/build/ts/subgraph/types.d.ts +2 -2
  224. package/build/ts/subgraph/types.d.ts.map +1 -1
  225. package/build/tsconfig.build.tsbuildinfo +1 -1
  226. package/package.json +46 -39
  227. package/build/tests/e2e.aa.test.d.ts +0 -2
  228. package/build/tests/e2e.aa.test.d.ts.map +0 -1
  229. package/build/tests/e2e.aa.test.js +0 -103
  230. package/build/tests/e2e.aa.test.js.map +0 -1
  231. package/build/ts/deployer/utils.d.ts +0 -8
  232. package/build/ts/deployer/utils.d.ts.map +0 -1
  233. package/build/ts/deployer/utils.js +0 -9
  234. package/build/ts/deployer/utils.js.map +0 -1
package/LICENSE CHANGED
@@ -1,7 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2020 Barry WhiteHat, Kendrick Tan, Kobi Gurkan, Kirill Goncharov
4
- Cory Dickson, Han Jian, Chih-Cheng Liang, and Koh Wei Jie
3
+ Copyright (c) 2025 Ethereum Foundation
5
4
 
6
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -2,16 +2,77 @@
2
2
 
3
3
  Please refer to [Offchain relayer service documentation](https://maci.pse.dev/docs/category/offchain-relayer) for more information.
4
4
 
5
- ## Instructions
6
-
7
- 1. Add `.env` file (see `.env.example`).
8
- 2. Generate RSA key pair with `pnpm run generate-keypair`.
9
- 3. Download zkey files using `pnpm run download-zkeys:{type}` (only test type is available for now).
10
- 4. Make sure you copied RSA public key to your application. This will be needed for encrypting `Authorization` header and coordinator private key for proof generation. Also it can be accessed through API method `GET v1/proof/publicKey`.
11
- 5. Run `pnpm run start` to run the service.
12
- 6. All API calls must be called with `Authorization` header, where the value is encrypted with RSA public key you generated before. Header value contains message signature and message digest created by `COORDINATOR_ADDRESSES`. The format is `publicEncrypt({signature}:{digest})`.
13
- Make sure you set `COORDINATOR_ADDRESSES` env variable and sign any message with the addresses from your application (see [AccountSignatureGuard](./ts/auth/AccountSignatureGuard.service.ts)).
14
- 7. Proofs can be generated with `POST v1/proof/generate` API method or with Websockets (see [dto spec](./ts/proof/dto.ts), [controller](./ts/app.controller.ts) and [wsgateway](./ts/events/events.gateway.ts)).
5
+ ## Requirements
6
+
7
+ 1. [Node.js](https://nodejs.org/en) version 20.0.0.
8
+ 2. [pnpm](https://pnpm.io/installation) package manager.
9
+ 3. [rapidsnark](https://github.com/iden3/rapidsnark) program.
10
+ 4. (Optional) [Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/) database if you want to use the scheduler module.
11
+
12
+ - Please note that the build process might fail in a Windows environment. If you are using Windows, it is recommended to use Windows Subsystem for Linux (WSL) or a virtual machine with a Linux distribution.
13
+
14
+ ## Install and build it from source
15
+
16
+ 1. Install dependencies and build the project
17
+
18
+ ```bash
19
+ pnpm install
20
+ pnpm run build
21
+ ```
22
+
23
+ 2. Install Redis database (if the scheduler module is going to be used) using [the official guide](https://redis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/)
24
+
25
+ 3. Download the zkeys
26
+
27
+ ```bash
28
+ pnpm run download-zkeys:test
29
+ # for production zkeys
30
+ # pnpm run download-zkeys:ceremony
31
+ ```
32
+
33
+ 4. Move to the coordinator service directory
34
+
35
+ ```bash
36
+ cd apps/coordinator
37
+ ```
38
+
39
+ 5. Generate the RSA key pair to encrypt values throughout the communication workflow
40
+
41
+ ```bash
42
+ pnpm run generate-keypair
43
+ ```
44
+
45
+ 6. Setup .env file (see `.env.example` for reference)
46
+
47
+ ```bash
48
+ cp .env.example .env
49
+ ```
50
+
51
+ 7. Run the NestJS application
52
+
53
+ ```bash
54
+ pnpm run start
55
+ # or
56
+ pnpm run start:prod
57
+ ```
58
+
59
+ ## Docker
60
+
61
+ Remember to run it from the monorepo root directory.
62
+
63
+ ```bash
64
+ # Build docker
65
+ docker compose -f apps/coordinator/docker-compose.yml build
66
+
67
+ # Run container detached
68
+ docker compose -f apps/coordinator/docker-compose.yml up -d
69
+
70
+ # Enter the container
71
+ docker compose -f apps/coordinator/docker-compose.yml exec coordinator-service /bin/sh
72
+
73
+ # Stop container
74
+ docker compose -f apps/coordinator/docker-compose.yml down
75
+ ```
15
76
 
16
77
  ## Subgraph deployment
17
78
 
@@ -7,22 +7,30 @@ dotenv.config();
7
7
  const parentDir = __dirname.includes("build") ? ".." : "";
8
8
  const TEST_MNEMONIC = "test test test test test test test test test test test junk";
9
9
  module.exports = {
10
- defaultNetwork: "sepolia",
10
+ defaultNetwork: "localhost",
11
11
  networks: {
12
- sepolia: {
12
+ localhost: {
13
13
  url: process.env.COORDINATOR_RPC_URL || "http://localhost:8545",
14
- accounts: {
15
- mnemonic: TEST_MNEMONIC,
16
- path: "m/44'/60'/0'/0",
17
- initialIndex: 0,
18
- count: 20,
19
- },
20
- loggingEnabled: false,
14
+ accounts: process.env.PRIVATE_KEY
15
+ ? [process.env.PRIVATE_KEY]
16
+ : {
17
+ mnemonic: process.env.MNEMONIC || TEST_MNEMONIC,
18
+ path: "m/44'/60'/0'/0",
19
+ initialIndex: process.env.INITIAL_INDEX ? Number(process.env.INITIAL_INDEX) : 0,
20
+ count: 20,
21
+ },
21
22
  },
22
23
  hardhat: {
23
24
  loggingEnabled: false,
25
+ mining: {
26
+ auto: false,
27
+ interval: 5000,
28
+ },
24
29
  },
25
30
  },
31
+ solidity: {
32
+ version: "0.8.28",
33
+ },
26
34
  paths: {
27
35
  sources: path.resolve(__dirname, parentDir, "./node_modules/@maci-protocol/sdk/node_modules/@maci-protocol/contracts/contracts"),
28
36
  artifacts: path.resolve(__dirname, parentDir, "./node_modules/@maci-protocol/sdk/node_modules/@maci-protocol/contracts/artifacts"),
@@ -1 +1 @@
1
- {"version":3,"file":"hardhat.config.cjs","sourceRoot":"","sources":["../hardhat.config.cjs"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,MAAM,aAAa,GAAG,6DAA6D,CAAC;AAEpF,MAAM,CAAC,OAAO,GAAG;IACf,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,uBAAuB;YAC/D,QAAQ,EAAE;gBACR,QAAQ,EAAE,aAAa;gBACvB,IAAI,EAAE,gBAAgB;gBACtB,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,EAAE;aACV;YACD,cAAc,EAAE,KAAK;SACtB;QACD,OAAO,EAAE;YACP,cAAc,EAAE,KAAK;SACtB;KACF;IACD,KAAK,EAAE;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,CACnB,SAAS,EACT,SAAS,EACT,mFAAmF,CACpF;QACD,SAAS,EAAE,IAAI,CAAC,OAAO,CACrB,SAAS,EACT,SAAS,EACT,mFAAmF,CACpF;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"hardhat.config.cjs","sourceRoot":"","sources":["../hardhat.config.cjs"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,MAAM,aAAa,GAAG,6DAA6D,CAAC;AAEpF,MAAM,CAAC,OAAO,GAAG;IACf,cAAc,EAAE,WAAW;IAC3B,QAAQ,EAAE;QACR,SAAS,EAAE;YACT,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,uBAAuB;YAC/D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;gBAC/B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC3B,CAAC,CAAC;oBACE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;oBAC/C,IAAI,EAAE,gBAAgB;oBACtB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/E,KAAK,EAAE,EAAE;iBACV;SACN;QACD,OAAO,EAAE;YACP,cAAc,EAAE,KAAK;YACrB,MAAM,EAAE;gBACN,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE,IAAI;aACf;SACF;KACF;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,QAAQ;KAClB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,CACnB,SAAS,EACT,SAAS,EACT,mFAAmF,CACpF;QACD,SAAS,EAAE,IAAI,CAAC,OAAO,CACrB,SAAS,EACT,SAAS,EACT,mFAAmF,CACpF;KACF;CACF,CAAC"}
@@ -1,24 +1,27 @@
1
- declare const TEST_MNEMONIC: "test test test test test test test test test test test junk";
2
1
  export let defaultNetwork: string;
3
2
  export namespace networks {
4
- namespace sepolia {
3
+ namespace localhost {
5
4
  let url: string;
6
- namespace accounts {
7
- export { TEST_MNEMONIC as mnemonic };
8
- export let path: string;
9
- export let initialIndex: number;
10
- export let count: number;
11
- }
12
- let loggingEnabled: boolean;
5
+ let accounts: string[] | {
6
+ mnemonic: string;
7
+ path: string;
8
+ initialIndex: number;
9
+ count: number;
10
+ };
13
11
  }
14
12
  namespace hardhat {
15
- let loggingEnabled_1: boolean;
16
- export { loggingEnabled_1 as loggingEnabled };
13
+ let loggingEnabled: boolean;
14
+ namespace mining {
15
+ let auto: boolean;
16
+ let interval: number;
17
+ }
17
18
  }
18
19
  }
20
+ export namespace solidity {
21
+ let version: string;
22
+ }
19
23
  export namespace paths {
20
24
  let sources: string;
21
25
  let artifacts: string;
22
26
  }
23
- export {};
24
27
  //# sourceMappingURL=hardhat.config.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hardhat.config.d.cts","sourceRoot":"","sources":["../hardhat.config.cjs"],"names":[],"mappings":"AASA,6BAAsB,6DAA6D,CAAC"}
1
+ {"version":3,"file":"hardhat.config.d.cts","sourceRoot":"","sources":["../hardhat.config.cjs"],"names":[],"mappings":""}
@@ -17,8 +17,8 @@ export async function generateRsaKeypair() {
17
17
  const publicKey = keypair.publicKey.export({ type: "pkcs1", format: "pem" });
18
18
  const privateKey = keypair.privateKey.export({ type: "pkcs1", format: "pem" });
19
19
  await Promise.all([
20
- fs.promises.writeFile(path.resolve(process.env.COORDINATOR_PUBLIC_KEY_PATH), publicKey),
21
- fs.promises.writeFile(path.resolve(process.env.COORDINATOR_PRIVATE_KEY_PATH), privateKey),
20
+ fs.promises.writeFile(path.resolve(process.env.COORDINATOR_PUBLIC_KEY_PATH || "./public.key"), publicKey),
21
+ fs.promises.writeFile(path.resolve(process.env.COORDINATOR_PRIVATE_KEY_PATH || "./private.key"), privateKey),
22
22
  ]);
23
23
  }
24
24
  generateRsaKeypair();
@@ -1 +1 @@
1
- {"version":3,"file":"generateKeypair.js","sourceRoot":"","sources":["../../scripts/generateKeypair.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,yCAAyC;AACzC,iDAAiD;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,wCAAwC;AACxC,gDAAgD;AAEhD,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1G,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE;QACzC,aAAa,EAAE,cAAc;KAC9B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/E,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA4B,CAAC,EAAE,SAAS,CAAC;QACxF,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA6B,CAAC,EAAE,UAAU,CAAC;KAC3F,CAAC,CAAC;AACL,CAAC;AAED,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"generateKeypair.js","sourceRoot":"","sources":["../../scripts/generateKeypair.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,yCAAyC;AACzC,iDAAiD;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,wCAAwC;AACxC,gDAAgD;AAEhD,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1G,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE;QACzC,aAAa,EAAE,cAAc;KAC9B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/E,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,cAAc,CAAC,EAAE,SAAS,CAAC;QACzG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,eAAe,CAAC,EAAE,UAAU,CAAC;KAC7G,CAAC,CAAC;AACL,CAAC;AAED,kBAAkB,EAAE,CAAC"}
@@ -1,3 +1,3 @@
1
- import { genKeypair } from "@maci-protocol/crypto";
2
- genKeypair();
1
+ import { generateKeypair } from "@maci-protocol/crypto";
2
+ generateKeypair();
3
3
  //# sourceMappingURL=generateMaciKeyPair.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateMaciKeyPair.js","sourceRoot":"","sources":["../../scripts/generateMaciKeyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"generateMaciKeyPair.js","sourceRoot":"","sources":["../../scripts/generateMaciKeyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,eAAe,EAAE,CAAC"}
@@ -1,8 +1,7 @@
1
- export declare const pollJoiningTestZkeyPath = "./zkeys/PollJoining_10_test/PollJoining_10_test.0.zkey";
2
- export declare const testPollJoiningWasmPath = "./zkeys/PollJoining_10_test/PollJoining_10_test_js/PollJoining_10_test.wasm";
3
- export declare const testPollJoiningWitnessPath = "./zkeys/PollJoining_10_test/PollJoining_10_test_cpp/PollJoining_10_test";
1
+ export declare const pollJoiningTestZkeyPath: string;
2
+ export declare const testPollJoiningWasmPath: string;
3
+ export declare const testPollJoiningWitnessPath: string;
4
4
  export declare const testRapidsnarkPath: string;
5
5
  export declare const zeroUint256Encoded: string;
6
6
  export declare const oneUint256Encoded: string;
7
- export declare const pollDuration = 10;
8
7
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../tests/constants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,2DAA2D,CAAC;AAChG,eAAO,MAAM,uBAAuB,gFAAgF,CAAC;AACrH,eAAO,MAAM,0BAA0B,4EAA4E,CAAC;AACpH,eAAO,MAAM,kBAAkB,QAAyC,CAAC;AAEzE,eAAO,MAAM,kBAAkB,QAAsD,CAAC;AACtF,eAAO,MAAM,iBAAiB,QAAsD,CAAC;AAErF,eAAO,MAAM,YAAY,KAAK,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../tests/constants.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,uBAAuB,QAA+E,CAAC;AACpH,eAAO,MAAM,uBAAuB,QAGnC,CAAC;AACF,eAAO,MAAM,0BAA0B,QAGtC,CAAC;AACF,eAAO,MAAM,kBAAkB,QAAyC,CAAC;AAEzE,eAAO,MAAM,kBAAkB,QAAsD,CAAC;AACtF,eAAO,MAAM,iBAAiB,QAAsD,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import { AbiCoder } from "ethers";
2
2
  import { homedir } from "os";
3
- export const pollJoiningTestZkeyPath = "./zkeys/PollJoining_10_test/PollJoining_10_test.0.zkey";
4
- export const testPollJoiningWasmPath = "./zkeys/PollJoining_10_test/PollJoining_10_test_js/PollJoining_10_test.wasm";
5
- export const testPollJoiningWitnessPath = "./zkeys/PollJoining_10_test/PollJoining_10_test_cpp/PollJoining_10_test";
3
+ import path from "path";
4
+ const root = path.resolve(__dirname, "../../..");
5
+ export const pollJoiningTestZkeyPath = path.resolve(root, "./zkeys/PollJoining_10_test/PollJoining_10_test.0.zkey");
6
+ export const testPollJoiningWasmPath = path.resolve(root, "./zkeys/PollJoining_10_test/PollJoining_10_test_js/PollJoining_10_test.wasm");
7
+ export const testPollJoiningWitnessPath = path.resolve(root, "./zkeys/PollJoining_10_test/PollJoining_10_test_cpp/PollJoining_10_test");
6
8
  export const testRapidsnarkPath = `${homedir()}/rapidsnark/build/prover`;
7
9
  export const zeroUint256Encoded = AbiCoder.defaultAbiCoder().encode(["uint256"], [0]);
8
10
  export const oneUint256Encoded = AbiCoder.defaultAbiCoder().encode(["uint256"], [1]);
9
- export const pollDuration = 10; // 100 seconds (added to unix timestamp of start date)
10
11
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../tests/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,wDAAwD,CAAC;AAChG,MAAM,CAAC,MAAM,uBAAuB,GAAG,6EAA6E,CAAC;AACrH,MAAM,CAAC,MAAM,0BAA0B,GAAG,yEAAyE,CAAC;AACpH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,OAAO,EAAE,0BAA0B,CAAC;AAEzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,sDAAsD"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../tests/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,wDAAwD,CAAC,CAAC;AACpH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CACjD,IAAI,EACJ,6EAA6E,CAC9E,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,OAAO,CACpD,IAAI,EACJ,yEAAyE,CAC1E,CAAC;AACF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,OAAO,EAAE,0BAA0B,CAAC;AAEzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -1,59 +1,57 @@
1
- // To only run this file: pnpm exec jest --testPathPattern=tests/e2e.deploy.test.ts
2
- import { genRandomSalt } from "@maci-protocol/crypto";
3
1
  import { Keypair } from "@maci-protocol/domainobjs";
4
- import { joinPoll, publish, signup, sleep } from "@maci-protocol/sdk";
2
+ import { isArm, joinPoll, signup, sleepUntil, ESupportedChains, ContractStorage } from "@maci-protocol/sdk";
5
3
  import { ValidationPipe } from "@nestjs/common";
6
4
  import { Test } from "@nestjs/testing";
7
5
  import dotenv from "dotenv";
8
- import hardhat from "hardhat";
9
6
  import { io } from "socket.io-client";
10
7
  import { zeroAddress } from "viem";
8
+ import path from "path";
11
9
  import { AppModule } from "../ts/app.module";
12
- import { ESupportedNetworks } from "../ts/common";
13
- import { getPublicClient } from "../ts/common/accountAbstraction";
14
- import { testMaciDeploymentConfig, testPollDeploymentConfig } from "../ts/deployer/__tests__/utils";
10
+ import { getSigner } from "../ts/common";
11
+ import { pollDuration, pollStartDateExtraSeconds, testMaciDeploymentConfig, testPollDeploymentConfig, } from "../ts/deployer/__tests__/utils";
12
+ import { DeployerModule } from "../ts/deployer/deployer.module";
15
13
  import { FileModule } from "../ts/file/file.module";
16
- import { generateApproval, getKernelAccount } from "../ts/sessionKeys/__tests__/utils";
17
- import { pollDuration, pollJoiningTestZkeyPath, testPollJoiningWasmPath, testPollJoiningWitnessPath, testRapidsnarkPath, zeroUint256Encoded, } from "./constants";
18
- import { getAuthorizationHeader, rechargeGasIfNeeded } from "./utils";
14
+ import { ProofModule } from "../ts/proof/proof.module";
15
+ import { SessionKeysModule } from "../ts/sessionKeys/sessionKeys.module";
16
+ import { pollJoiningTestZkeyPath, testPollJoiningWasmPath, testPollJoiningWitnessPath, testRapidsnarkPath, zeroUint256Encoded, } from "./constants";
17
+ import { getAuthorizationHeader } from "./utils";
19
18
  dotenv.config();
20
- const LOCALHOST = "http://localhost:3000";
19
+ jest.setTimeout(700000); // Sets timeout to 700 seconds
20
+ const PORT = process.env.COORDINATOR_PORT || 3001;
21
+ const TEST_URL = `http://localhost:${PORT}/v1`;
22
+ const CHAIN = ESupportedChains.Localhost;
23
+ const REGEX_SUBGRAPH = /^https:\/\/api\.studio\.thegraph\.com\/query\/\d+\/maci-subgraph\/v0\.0\.\d+$/;
21
24
  const NUM_USERS = 1;
22
- const voteOptions = {
25
+ const VOTE_OPTIONS = {
23
26
  "0": 0,
24
27
  "1": 0,
25
28
  };
29
+ const useWasm = isArm();
26
30
  describe("E2E Deployment Tests", () => {
27
31
  let signer;
28
32
  let encryptedHeader;
29
- let coordinatorKeypair;
30
- let sessionKeyAddress;
31
- let approval;
32
33
  let app;
33
34
  let socket;
34
- const publicClient = getPublicClient(ESupportedNetworks.OPTIMISM_SEPOLIA);
35
35
  let maciAddress;
36
+ let maciCreatedAt;
36
37
  let pollId;
37
38
  // set up coordinator address
38
39
  beforeAll(async () => {
39
- [signer] = await hardhat.ethers.getSigners();
40
+ signer = await getSigner(CHAIN);
40
41
  encryptedHeader = await getAuthorizationHeader(signer);
41
- coordinatorKeypair = new Keypair();
42
42
  process.env.COORDINATOR_ADDRESSES = await signer.getAddress();
43
- await rechargeGasIfNeeded(process.env.COORDINATOR_ADDRESSES, "0.007", "0.007");
44
- });
45
- // set up NestJS app
46
- beforeAll(async () => {
47
43
  const moduleFixture = await Test.createTestingModule({
48
- imports: [AppModule, FileModule],
44
+ imports: [AppModule, FileModule, DeployerModule, ProofModule, SessionKeysModule],
49
45
  }).compile();
50
46
  app = moduleFixture.createNestApplication();
51
47
  app.useGlobalPipes(new ValidationPipe({ transform: true }));
52
48
  await app.init();
53
- await app.listen(3000);
49
+ await app.listen(PORT);
54
50
  });
55
51
  afterAll(async () => {
56
52
  await app.close();
53
+ const storageInstance = ContractStorage.getInstance(path.join(process.cwd(), "deployed-contracts.json"));
54
+ storageInstance.cleanup(CHAIN);
57
55
  });
58
56
  // set up auth header in WS connection
59
57
  beforeEach(async () => {
@@ -74,9 +72,24 @@ describe("E2E Deployment Tests", () => {
74
72
  afterEach(() => {
75
73
  socket.disconnect();
76
74
  });
77
- // run tests
75
+ test("should return true in the health check", async () => {
76
+ const response = await fetch(`${TEST_URL}/health/check`, { method: "GET" });
77
+ const body = (await response.json());
78
+ expect(response.status).toBe(200);
79
+ expect(body.rapidsnark.rapidsnarkIsExecutable).toBe(true);
80
+ expect(body.zkeysDirectory.zkeysDirectoryExists).toBe(true);
81
+ expect(body.coordinatorWalletFunds.fundsInNetworks[0].address).not.toBe(zeroAddress);
82
+ });
83
+ test("should retrieve RSA public key", async () => {
84
+ const response = await fetch(`${TEST_URL}/proof/publicKey`, {
85
+ method: "GET",
86
+ });
87
+ const body = (await response.json());
88
+ expect(response.status).toBe(200);
89
+ expect(body.publicKey).toBeDefined();
90
+ });
78
91
  test("should retrieve the session key address", async () => {
79
- const response = await fetch(`${LOCALHOST}/v1/session-keys/generate`, {
92
+ const response = await fetch(`${TEST_URL}/session-keys/generate`, {
80
93
  method: "GET",
81
94
  headers: {
82
95
  Authorization: encryptedHeader,
@@ -85,54 +98,41 @@ describe("E2E Deployment Tests", () => {
85
98
  const body = (await response.json());
86
99
  expect(response.status).toBe(200);
87
100
  expect(body.sessionKeyAddress).not.toBe(zeroAddress);
88
- // save them for next tests
89
- sessionKeyAddress = body.sessionKeyAddress;
90
- approval = await generateApproval(sessionKeyAddress);
91
- const sessionKeyAccount = await getKernelAccount(sessionKeyAddress);
92
- await rechargeGasIfNeeded(sessionKeyAccount.address, "0.03", "0.03");
93
101
  });
94
102
  test("should deploy MACI correctly", async () => {
95
- const config = testMaciDeploymentConfig;
96
- config.VkRegistry.args.stateTreeDepth = config.VkRegistry.args.stateTreeDepth.toString();
97
- config.VkRegistry.args.intStateTreeDepth = config.VkRegistry.args.intStateTreeDepth.toString();
98
- config.VkRegistry.args.voteOptionTreeDepth = config.VkRegistry.args.voteOptionTreeDepth.toString();
99
- const response = await fetch(`${LOCALHOST}/v1/deploy/maci`, {
103
+ const response = await fetch(`${TEST_URL}/deploy/maci`, {
100
104
  method: "POST",
101
105
  headers: {
102
106
  Authorization: encryptedHeader,
103
107
  "Content-Type": "application/json",
104
108
  },
105
109
  body: JSON.stringify({
106
- approval,
107
- sessionKeyAddress,
108
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
109
- config,
110
+ chain: CHAIN,
111
+ config: testMaciDeploymentConfig,
110
112
  }),
111
113
  });
112
114
  const body = (await response.json());
113
115
  expect(response.status).toBe(201);
114
116
  expect(body.address).not.toBe(zeroAddress);
115
117
  // save them for next tests
118
+ const blockNumber = await signer.provider.getBlockNumber();
119
+ maciCreatedAt = BigInt(blockNumber);
116
120
  maciAddress = body.address;
117
121
  });
118
122
  test("should deploy a poll correctly", async () => {
119
- const config = testPollDeploymentConfig;
120
- config.coordinatorPubkey = coordinatorKeypair.pubKey.serialize();
121
- config.voteOptions = config.voteOptions.toString();
122
- const startDate = Math.floor(Date.now() / 1000) + 10;
123
- config.startDate = startDate;
124
- config.endDate = startDate + pollDuration;
125
- const response = await fetch(`${LOCALHOST}/v1/deploy/poll`, {
123
+ testPollDeploymentConfig.voteOptions = testPollDeploymentConfig.voteOptions.toString();
124
+ const startDate = Math.floor(Date.now() / 1000) + pollStartDateExtraSeconds;
125
+ testPollDeploymentConfig.startDate = startDate;
126
+ testPollDeploymentConfig.endDate = startDate + pollDuration;
127
+ const response = await fetch(`${TEST_URL}/deploy/poll`, {
126
128
  method: "POST",
127
129
  headers: {
128
130
  Authorization: encryptedHeader,
129
131
  "Content-Type": "application/json",
130
132
  },
131
133
  body: JSON.stringify({
132
- approval,
133
- sessionKeyAddress,
134
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
135
- config,
134
+ chain: CHAIN,
135
+ config: testPollDeploymentConfig,
136
136
  }),
137
137
  });
138
138
  const body = (await response.json());
@@ -141,41 +141,19 @@ describe("E2E Deployment Tests", () => {
141
141
  // save them for next tests
142
142
  pollId = BigInt(body.pollId);
143
143
  });
144
- test("should deploy a subgraph correctly", async () => {
145
- const blockNumber = Number(await publicClient.getBlockNumber());
146
- const response = await fetch(`${LOCALHOST}/v1/subgraph/deploy`, {
147
- method: "POST",
148
- headers: {
149
- Authorization: encryptedHeader,
150
- "Content-Type": "application/json",
151
- },
152
- body: JSON.stringify({
153
- maciContractAddress: maciAddress,
154
- startBlock: blockNumber,
155
- network: ESupportedNetworks.OPTIMISM_SEPOLIA,
156
- name: process.env.SUBGRAPH_NAME,
157
- tag: `v0.0.${blockNumber}`, // different versions per test using block number
158
- }),
159
- });
160
- const body = (await response.json());
161
- const { url } = body;
162
- const regex = /^https:\/\/api\.studio\.thegraph\.com\/query\/\d+\/maci-subgraph\/v0\.0\.\d+$/;
163
- expect(response.status).toBe(201);
164
- expect(body.url).toBeDefined();
165
- expect(regex.test(url)).toBe(true);
166
- });
167
144
  test("should allow voting on a poll", async () => {
145
+ await sleepUntil(testPollDeploymentConfig.startDate * 1000);
168
146
  for (let i = 0; i < NUM_USERS; i += 1) {
169
147
  const keypairUser = new Keypair();
170
- const pubkeyUser = keypairUser.pubKey.serialize();
171
- const privkeyUser = keypairUser.privKey.serialize();
148
+ const userPublicKey = keypairUser.publicKey.serialize();
149
+ const userPrivateKey = keypairUser.privateKey.serialize();
172
150
  const vote = i % 2;
173
- voteOptions[String(vote)] += 1;
151
+ VOTE_OPTIONS[String(vote)] += 1;
174
152
  // user signs up to MACI
175
153
  // eslint-disable-next-line no-await-in-loop
176
154
  await signup({
177
155
  maciAddress,
178
- maciPubKey: pubkeyUser,
156
+ maciPublicKey: userPublicKey,
179
157
  sgData: zeroUint256Encoded,
180
158
  signer,
181
159
  });
@@ -183,38 +161,51 @@ describe("E2E Deployment Tests", () => {
183
161
  // eslint-disable-next-line no-await-in-loop
184
162
  await joinPoll({
185
163
  maciAddress,
186
- privateKey: privkeyUser,
187
- stateIndex: 1n,
164
+ privateKey: userPrivateKey,
188
165
  pollId: BigInt(pollId),
189
166
  pollJoiningZkey: pollJoiningTestZkeyPath,
190
- useWasm: true,
167
+ useWasm,
191
168
  pollWasm: testPollJoiningWasmPath,
192
- pollWitgen: testPollJoiningWitnessPath,
169
+ pollWitnessGenerator: testPollJoiningWitnessPath,
193
170
  rapidsnark: testRapidsnarkPath,
194
171
  sgDataArg: zeroUint256Encoded,
195
172
  ivcpDataArg: zeroUint256Encoded,
196
173
  signer,
197
174
  });
198
- // user publishes a vote
199
- // eslint-disable-next-line no-await-in-loop
200
- const publishData = await publish({
201
- pubkey: pubkeyUser,
202
- stateIndex: 1n,
203
- voteOptionIndex: BigInt(vote),
204
- nonce: 1n,
205
- pollId: BigInt(pollId),
206
- newVoteWeight: 1n,
207
- maciAddress,
208
- salt: genRandomSalt(),
209
- privateKey: privkeyUser,
210
- signer,
211
- });
212
- expect(publishData.hash).not.toBe(zeroAddress);
213
175
  }
214
176
  });
177
+ test("should deploy a subgraph correctly", async () => {
178
+ const response = await fetch(`${TEST_URL}/subgraph/deploy`, {
179
+ method: "POST",
180
+ headers: {
181
+ Authorization: encryptedHeader,
182
+ "Content-Type": "application/json",
183
+ },
184
+ body: JSON.stringify({
185
+ maciContractAddress: maciAddress,
186
+ startBlock: Number(maciCreatedAt),
187
+ network: ESupportedChains.OptimismSepolia,
188
+ name: process.env.SUBGRAPH_NAME,
189
+ tag: `v0.0.${+new Date()}`, // different versions per test using timestamp
190
+ }),
191
+ });
192
+ const body = await response.json();
193
+ if (response.status === 400) {
194
+ const errorMessage = body.message;
195
+ if (errorMessage.includes("api.thegraph.com | 502: Bad gateway")) {
196
+ // eslint-disable-next-line no-console
197
+ console.info("It looks like there was a problem with The Graph endpoint. We are passing this test.");
198
+ return;
199
+ }
200
+ }
201
+ const { url } = body;
202
+ expect(response.status).toBe(201);
203
+ expect(url).toBeDefined();
204
+ expect(REGEX_SUBGRAPH.test(url)).toBe(true);
205
+ });
215
206
  test("should merge correctly", async () => {
216
- await sleep(10000);
217
- const response = await fetch(`${LOCALHOST}/v1/proof/merge`, {
207
+ await sleepUntil((testPollDeploymentConfig.endDate + 13) * 1000); // 13 seconds of grace time after the poll end date
208
+ const response = await fetch(`${TEST_URL}/proof/merge`, {
218
209
  method: "POST",
219
210
  headers: {
220
211
  Authorization: encryptedHeader,
@@ -223,9 +214,48 @@ describe("E2E Deployment Tests", () => {
223
214
  body: JSON.stringify({
224
215
  maciContractAddress: maciAddress,
225
216
  pollId: Number(pollId),
226
- approval,
227
- sessionKeyAddress,
228
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
217
+ chain: CHAIN,
218
+ }),
219
+ });
220
+ expect(response.status).toBe(201);
221
+ });
222
+ test("should generate proofs correctly", async () => {
223
+ const response = await fetch(`${TEST_URL}/proof/generate`, {
224
+ method: "POST",
225
+ headers: {
226
+ Authorization: encryptedHeader,
227
+ "Content-Type": "application/json",
228
+ },
229
+ body: JSON.stringify({
230
+ poll: Number(pollId),
231
+ maciContractAddress: maciAddress,
232
+ mode: testPollDeploymentConfig.mode,
233
+ startBlock: Number(maciCreatedAt),
234
+ blocksPerBatch: 500,
235
+ chain: CHAIN,
236
+ useWasm,
237
+ }),
238
+ });
239
+ const body = (await response.json());
240
+ expect(response.status).toBe(201);
241
+ expect(body.processProofs).toBeDefined();
242
+ expect(body.processProofs.length).toBeGreaterThan(0);
243
+ expect(body.tallyProofs).toBeDefined();
244
+ expect(body.tallyProofs.length).toBeGreaterThan(0);
245
+ expect(body.tallyData).toBeDefined();
246
+ expect(body.tallyData.results).toBeDefined();
247
+ });
248
+ test("should submit results on-chain correctly", async () => {
249
+ const response = await fetch(`${TEST_URL}/proof/submit`, {
250
+ method: "POST",
251
+ headers: {
252
+ Authorization: encryptedHeader,
253
+ "Content-Type": "application/json",
254
+ },
255
+ body: JSON.stringify({
256
+ pollId: Number(pollId),
257
+ maciContractAddress: maciAddress,
258
+ chain: CHAIN,
229
259
  }),
230
260
  });
231
261
  expect(response.status).toBe(201);