@maci-protocol/coordinator 0.0.0-ci.7fb2610 → 0.0.0-ci.805eed1

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 (192) hide show
  1. package/build/hardhat.config.cjs +6 -3
  2. package/build/hardhat.config.cjs.map +1 -1
  3. package/build/hardhat.config.d.cts +6 -4
  4. package/build/scripts/generateKeypair.js +2 -2
  5. package/build/scripts/generateKeypair.js.map +1 -1
  6. package/build/tests/constants.d.ts +3 -3
  7. package/build/tests/constants.d.ts.map +1 -1
  8. package/build/tests/constants.js +5 -3
  9. package/build/tests/constants.js.map +1 -1
  10. package/build/tests/e2e.deploy.test.js +11 -37
  11. package/build/tests/e2e.deploy.test.js.map +1 -1
  12. package/build/tests/e2e.redis.test.d.ts +2 -0
  13. package/build/tests/e2e.redis.test.d.ts.map +1 -0
  14. package/build/tests/e2e.redis.test.js +118 -0
  15. package/build/tests/e2e.redis.test.js.map +1 -0
  16. package/build/tests/utils.d.ts +1 -1
  17. package/build/tests/utils.d.ts.map +1 -1
  18. package/build/tests/utils.js +5 -3
  19. package/build/tests/utils.js.map +1 -1
  20. package/build/ts/app.module.d.ts.map +1 -1
  21. package/build/ts/app.module.js +4 -0
  22. package/build/ts/app.module.js.map +1 -1
  23. package/build/ts/common/__tests__/common.test.js +40 -28
  24. package/build/ts/common/__tests__/common.test.js.map +1 -1
  25. package/build/ts/common/accountAbstraction.d.ts +5 -5
  26. package/build/ts/common/accountAbstraction.d.ts.map +1 -1
  27. package/build/ts/common/accountAbstraction.js +10 -8
  28. package/build/ts/common/accountAbstraction.js.map +1 -1
  29. package/build/ts/common/chain.d.ts +10 -4
  30. package/build/ts/common/chain.d.ts.map +1 -1
  31. package/build/ts/common/chain.js +15 -9
  32. package/build/ts/common/chain.js.map +1 -1
  33. package/build/ts/common/errors.d.ts +15 -11
  34. package/build/ts/common/errors.d.ts.map +1 -1
  35. package/build/ts/common/errors.js +15 -11
  36. package/build/ts/common/errors.js.map +1 -1
  37. package/build/ts/common/http.d.ts +6 -0
  38. package/build/ts/common/http.d.ts.map +1 -0
  39. package/build/ts/common/http.js +49 -0
  40. package/build/ts/common/http.js.map +1 -0
  41. package/build/ts/common/index.d.ts +1 -1
  42. package/build/ts/common/index.d.ts.map +1 -1
  43. package/build/ts/common/index.js +1 -1
  44. package/build/ts/common/index.js.map +1 -1
  45. package/build/ts/common/networks.d.ts +2 -21
  46. package/build/ts/common/networks.d.ts.map +1 -1
  47. package/build/ts/common/networks.js +39 -48
  48. package/build/ts/common/networks.js.map +1 -1
  49. package/build/ts/common/types.d.ts +2 -2
  50. package/build/ts/common/types.d.ts.map +1 -1
  51. package/build/ts/deployer/__tests__/deployer.controller.test.js +17 -19
  52. package/build/ts/deployer/__tests__/deployer.controller.test.js.map +1 -1
  53. package/build/ts/deployer/__tests__/deployer.service.test.js +171 -113
  54. package/build/ts/deployer/__tests__/deployer.service.test.js.map +1 -1
  55. package/build/ts/deployer/__tests__/utils.d.ts +8 -8
  56. package/build/ts/deployer/__tests__/utils.d.ts.map +1 -1
  57. package/build/ts/deployer/__tests__/utils.js +11 -8
  58. package/build/ts/deployer/__tests__/utils.js.map +1 -1
  59. package/build/ts/deployer/deployer.controller.d.ts.map +1 -1
  60. package/build/ts/deployer/deployer.controller.js +19 -6
  61. package/build/ts/deployer/deployer.controller.js.map +1 -1
  62. package/build/ts/deployer/deployer.service.d.ts +15 -5
  63. package/build/ts/deployer/deployer.service.d.ts.map +1 -1
  64. package/build/ts/deployer/deployer.service.js +78 -34
  65. package/build/ts/deployer/deployer.service.js.map +1 -1
  66. package/build/ts/deployer/dto.d.ts +3 -3
  67. package/build/ts/deployer/dto.d.ts.map +1 -1
  68. package/build/ts/deployer/dto.js +5 -5
  69. package/build/ts/deployer/dto.js.map +1 -1
  70. package/build/ts/deployer/types.d.ts +25 -21
  71. package/build/ts/deployer/types.d.ts.map +1 -1
  72. package/build/ts/file/file.service.d.ts.map +1 -1
  73. package/build/ts/file/file.service.js +2 -1
  74. package/build/ts/file/file.service.js.map +1 -1
  75. package/build/ts/health/__tests__/health.controller.test.js +37 -7
  76. package/build/ts/health/__tests__/health.controller.test.js.map +1 -1
  77. package/build/ts/health/__tests__/health.service.test.js +40 -16
  78. package/build/ts/health/__tests__/health.service.test.js.map +1 -1
  79. package/build/ts/health/health.module.d.ts.map +1 -1
  80. package/build/ts/health/health.module.js +2 -1
  81. package/build/ts/health/health.module.js.map +1 -1
  82. package/build/ts/health/health.service.d.ts +8 -1
  83. package/build/ts/health/health.service.d.ts.map +1 -1
  84. package/build/ts/health/health.service.js +38 -31
  85. package/build/ts/health/health.service.js.map +1 -1
  86. package/build/ts/health/types.d.ts +13 -5
  87. package/build/ts/health/types.d.ts.map +1 -1
  88. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts +11 -0
  89. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts.map +1 -0
  90. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js +12 -0
  91. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js.map +1 -0
  92. package/build/ts/proof/__tests__/proof.controller.test.js +5 -6
  93. package/build/ts/proof/__tests__/proof.controller.test.js.map +1 -1
  94. package/build/ts/proof/__tests__/proof.gateway.test.js +2 -3
  95. package/build/ts/proof/__tests__/proof.gateway.test.js.map +1 -1
  96. package/build/ts/proof/__tests__/proof.service.test.js +4 -9
  97. package/build/ts/proof/__tests__/proof.service.test.js.map +1 -1
  98. package/build/ts/proof/dto.d.ts +4 -5
  99. package/build/ts/proof/dto.d.ts.map +1 -1
  100. package/build/ts/proof/dto.js +7 -8
  101. package/build/ts/proof/dto.js.map +1 -1
  102. package/build/ts/proof/proof.controller.d.ts.map +1 -1
  103. package/build/ts/proof/proof.controller.js +37 -11
  104. package/build/ts/proof/proof.controller.js.map +1 -1
  105. package/build/ts/proof/proof.module.d.ts.map +1 -1
  106. package/build/ts/proof/proof.module.js +1 -0
  107. package/build/ts/proof/proof.module.js.map +1 -1
  108. package/build/ts/proof/proof.service.d.ts.map +1 -1
  109. package/build/ts/proof/proof.service.js.map +1 -1
  110. package/build/ts/proof/types.d.ts +4 -5
  111. package/build/ts/proof/types.d.ts.map +1 -1
  112. package/build/ts/proof/types.js.map +1 -1
  113. package/build/ts/redis/__tests__/redis.service.test.d.ts +2 -0
  114. package/build/ts/redis/__tests__/redis.service.test.d.ts.map +1 -0
  115. package/build/ts/redis/__tests__/redis.service.test.js +148 -0
  116. package/build/ts/redis/__tests__/redis.service.test.js.map +1 -0
  117. package/build/ts/redis/redis.module.d.ts +3 -0
  118. package/build/ts/redis/redis.module.d.ts.map +1 -0
  119. package/build/ts/redis/redis.module.js +18 -0
  120. package/build/ts/redis/redis.module.js.map +1 -0
  121. package/build/ts/redis/redis.service.d.ts +53 -0
  122. package/build/ts/redis/redis.service.d.ts.map +1 -0
  123. package/build/ts/redis/redis.service.js +99 -0
  124. package/build/ts/redis/redis.service.js.map +1 -0
  125. package/build/ts/redis/types.d.ts +66 -0
  126. package/build/ts/redis/types.d.ts.map +1 -0
  127. package/build/ts/redis/types.js +2 -0
  128. package/build/ts/redis/types.js.map +1 -0
  129. package/build/ts/redis/utils.d.ts +20 -0
  130. package/build/ts/redis/utils.d.ts.map +1 -0
  131. package/build/ts/redis/utils.js +27 -0
  132. package/build/ts/redis/utils.js.map +1 -0
  133. package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts +2 -0
  134. package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts.map +1 -0
  135. package/build/ts/scheduler/__tests__/scheduler.controller.test.js +62 -0
  136. package/build/ts/scheduler/__tests__/scheduler.controller.test.js.map +1 -0
  137. package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts +2 -0
  138. package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts.map +1 -0
  139. package/build/ts/scheduler/__tests__/scheduler.service.test.js +369 -0
  140. package/build/ts/scheduler/__tests__/scheduler.service.test.js.map +1 -0
  141. package/build/ts/scheduler/dto.d.ts +41 -0
  142. package/build/ts/scheduler/dto.d.ts.map +1 -0
  143. package/build/ts/scheduler/dto.js +115 -0
  144. package/build/ts/scheduler/dto.js.map +1 -0
  145. package/build/ts/scheduler/scheduler.controller.d.ts +32 -0
  146. package/build/ts/scheduler/scheduler.controller.d.ts.map +1 -0
  147. package/build/ts/scheduler/scheduler.controller.js +118 -0
  148. package/build/ts/scheduler/scheduler.controller.js.map +1 -0
  149. package/build/ts/scheduler/scheduler.module.d.ts +3 -0
  150. package/build/ts/scheduler/scheduler.module.d.ts.map +1 -0
  151. package/build/ts/scheduler/scheduler.module.js +24 -0
  152. package/build/ts/scheduler/scheduler.module.js.map +1 -0
  153. package/build/ts/scheduler/scheduler.service.d.ts +71 -0
  154. package/build/ts/scheduler/scheduler.service.d.ts.map +1 -0
  155. package/build/ts/scheduler/scheduler.service.js +297 -0
  156. package/build/ts/scheduler/scheduler.service.js.map +1 -0
  157. package/build/ts/scheduler/types.d.ts +65 -0
  158. package/build/ts/scheduler/types.d.ts.map +1 -0
  159. package/build/ts/scheduler/types.js +2 -0
  160. package/build/ts/scheduler/types.js.map +1 -0
  161. package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js +34 -19
  162. package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js.map +1 -1
  163. package/build/ts/sessionKeys/__tests__/utils.d.ts +1 -1
  164. package/build/ts/sessionKeys/__tests__/utils.d.ts.map +1 -1
  165. package/build/ts/sessionKeys/__tests__/utils.js +7 -6
  166. package/build/ts/sessionKeys/__tests__/utils.js.map +1 -1
  167. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts +1 -1
  168. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts.map +1 -1
  169. package/build/ts/sessionKeys/sessionKeys.service.d.ts +4 -3
  170. package/build/ts/sessionKeys/sessionKeys.service.d.ts.map +1 -1
  171. package/build/ts/sessionKeys/sessionKeys.service.js +1 -2
  172. package/build/ts/sessionKeys/sessionKeys.service.js.map +1 -1
  173. package/build/ts/subgraph/__tests__/subgraph.controller.test.js +3 -3
  174. package/build/ts/subgraph/__tests__/subgraph.controller.test.js.map +1 -1
  175. package/build/ts/subgraph/__tests__/subgraph.gateway.test.js +2 -2
  176. package/build/ts/subgraph/__tests__/subgraph.gateway.test.js.map +1 -1
  177. package/build/ts/subgraph/__tests__/subgraph.service.test.js +3 -2
  178. package/build/ts/subgraph/__tests__/subgraph.service.test.js.map +1 -1
  179. package/build/ts/subgraph/dto.d.ts +2 -2
  180. package/build/ts/subgraph/dto.d.ts.map +1 -1
  181. package/build/ts/subgraph/dto.js +3 -3
  182. package/build/ts/subgraph/dto.js.map +1 -1
  183. package/build/ts/subgraph/subgraph.controller.d.ts.map +1 -1
  184. package/build/ts/subgraph/subgraph.controller.js +8 -3
  185. package/build/ts/subgraph/subgraph.controller.js.map +1 -1
  186. package/build/ts/subgraph/subgraph.service.d.ts.map +1 -1
  187. package/build/ts/subgraph/subgraph.service.js +7 -5
  188. package/build/ts/subgraph/subgraph.service.js.map +1 -1
  189. package/build/ts/subgraph/types.d.ts +2 -2
  190. package/build/ts/subgraph/types.d.ts.map +1 -1
  191. package/build/tsconfig.build.tsbuildinfo +1 -1
  192. package/package.json +32 -25
@@ -0,0 +1,66 @@
1
+ import type { EMode, ESupportedChains } from "@maci-protocol/sdk";
2
+ /**
3
+ * Interface of the minimal properties to identify a scheduled poll
4
+ */
5
+ export interface IIdentityScheduledPoll {
6
+ /**
7
+ * Maci contract address
8
+ */
9
+ maciAddress: string;
10
+ /**
11
+ * Poll id (unique identifier)
12
+ */
13
+ pollId: string;
14
+ /**
15
+ * Chain in which the poll is deployed
16
+ */
17
+ chain: ESupportedChains;
18
+ }
19
+ /**
20
+ * Interface for scheduled polls stored in Redis
21
+ */
22
+ export interface IScheduledPoll extends IIdentityScheduledPoll {
23
+ /**
24
+ * Deployment block number
25
+ */
26
+ deploymentBlockNumber: number;
27
+ /**
28
+ * Voting mode
29
+ */
30
+ mode: EMode;
31
+ /**
32
+ * End date in seconds
33
+ */
34
+ endDate: number;
35
+ /**
36
+ * Whether the MACI contract's state root has been merged
37
+ */
38
+ merged: boolean;
39
+ /**
40
+ * Whether the proofs has been generated
41
+ */
42
+ proofsGenerated: boolean;
43
+ }
44
+ /**
45
+ * getPollKeyForRedis parameters
46
+ */
47
+ export interface IGetPollKeyForRedisParams extends IIdentityScheduledPoll {
48
+ /**
49
+ * Test environment flag (optional)
50
+ */
51
+ test?: boolean;
52
+ }
53
+ /**
54
+ * Interface for getAll single object
55
+ */
56
+ export interface IGetAllSingleObject {
57
+ /**
58
+ * The key of the object
59
+ */
60
+ key: string;
61
+ /**
62
+ * The value of the object
63
+ */
64
+ value: string;
65
+ }
66
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../ts/redis/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,sBAAsB;IAC5D;;OAEG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,IAAI,EAAE,KAAK,CAAC;IAEZ;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IACvE;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../ts/redis/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { IGetPollKeyForRedisParams, IIdentityScheduledPoll } from "./types";
2
+ /**
3
+ * Generates a Redis key for a poll based on its attributes
4
+ *
5
+ * @param chain - chain where the poll is deployed
6
+ * @param maciAddress - maci contract where the poll was created
7
+ * @param pollId - poll ID
8
+ * @param test - Optional flag to indicate if this is a test environment
9
+ * @returns key for Redis
10
+ */
11
+ export declare const getPollKeyForRedis: ({ chain, maciAddress, pollId, test }: IGetPollKeyForRedisParams) => string;
12
+ /**
13
+ * Generates a Redis key for a poll object
14
+ *
15
+ * @param scheduledPoll - poll object to generate the key from
16
+ * @param test - Optional flag to indicate if this is a test environment
17
+ * @returns key for Redis
18
+ */
19
+ export declare const getPollKeyFromObject: (scheduledPoll: IIdentityScheduledPoll, test?: boolean) => string;
20
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../ts/redis/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,sCAA8C,yBAAyB,KAAG,MAG5G,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,eAAe,sBAAsB,EAAE,OAAO,OAAO,KAAG,MAMzF,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Generates a Redis key for a poll based on its attributes
3
+ *
4
+ * @param chain - chain where the poll is deployed
5
+ * @param maciAddress - maci contract where the poll was created
6
+ * @param pollId - poll ID
7
+ * @param test - Optional flag to indicate if this is a test environment
8
+ * @returns key for Redis
9
+ */
10
+ export const getPollKeyForRedis = ({ chain, maciAddress, pollId, test = false }) => {
11
+ const isTest = test || process.env.NODE_ENV === "test";
12
+ return `${chain}-${maciAddress}-poll-${pollId}${isTest ? `-test` : ""}`;
13
+ };
14
+ /**
15
+ * Generates a Redis key for a poll object
16
+ *
17
+ * @param scheduledPoll - poll object to generate the key from
18
+ * @param test - Optional flag to indicate if this is a test environment
19
+ * @returns key for Redis
20
+ */
21
+ export const getPollKeyFromObject = (scheduledPoll, test) => getPollKeyForRedis({
22
+ chain: scheduledPoll.chain,
23
+ maciAddress: scheduledPoll.maciAddress,
24
+ pollId: scheduledPoll.pollId,
25
+ test,
26
+ });
27
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../ts/redis/utils.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAG,KAAK,EAA6B,EAAU,EAAE;IACpH,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;IACvD,OAAO,GAAG,KAAK,IAAI,WAAW,SAAS,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC1E,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,aAAqC,EAAE,IAAc,EAAU,EAAE,CACpG,kBAAkB,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC,KAAK;IAC1B,WAAW,EAAE,aAAa,CAAC,WAAW;IACtC,MAAM,EAAE,aAAa,CAAC,MAAM;IAC5B,IAAI;CACL,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheduler.controller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.controller.test.d.ts","sourceRoot":"","sources":["../../../../ts/scheduler/__tests__/scheduler.controller.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { EMode, ESupportedChains } from "@maci-protocol/sdk";
2
+ import { HttpException, HttpStatus } from "@nestjs/common";
3
+ import { SchedulerController } from "../scheduler.controller";
4
+ const scheduledPoll = {
5
+ maciAddress: "0x0",
6
+ pollId: 5,
7
+ mode: EMode.NON_QV,
8
+ chain: ESupportedChains.OptimismSepolia,
9
+ deploymentBlockNumber: 1,
10
+ };
11
+ const identityScheduledPoll = {
12
+ maciAddress: scheduledPoll.maciAddress,
13
+ pollId: scheduledPoll.pollId,
14
+ chain: scheduledPoll.chain,
15
+ };
16
+ describe("SchedulerController", () => {
17
+ let service;
18
+ let controller;
19
+ beforeEach(() => {
20
+ service = {
21
+ registerPoll: jest.fn().mockResolvedValue({ isScheduled: true }),
22
+ isPollScheduled: jest.fn().mockResolvedValue({ isScheduled: true }),
23
+ deleteScheduledPoll: jest.fn().mockResolvedValue({ isScheduled: false }),
24
+ };
25
+ controller = new SchedulerController(service);
26
+ });
27
+ describe("register", () => {
28
+ test("should register a poll for finalization", async () => {
29
+ const { isScheduled } = await controller.register(scheduledPoll);
30
+ expect(isScheduled).toBe(true);
31
+ });
32
+ test("should throw an error if registration fails", async () => {
33
+ const errorMessage = "Registration failed";
34
+ service.registerPoll.mockRejectedValueOnce(new Error(errorMessage));
35
+ await expect(controller.register(scheduledPoll)).rejects.toThrow(new HttpException(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR));
36
+ });
37
+ });
38
+ describe("status", () => {
39
+ test("should return scheduled poll status", async () => {
40
+ const { isScheduled } = await controller.status(identityScheduledPoll);
41
+ expect(isScheduled).toBe(true);
42
+ });
43
+ test("should throw an error if checking status fails", async () => {
44
+ const errorMessage = "checking status failed";
45
+ service.isPollScheduled.mockRejectedValueOnce(new Error(errorMessage));
46
+ await expect(controller.status(scheduledPoll)).rejects.toThrow(new HttpException(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR));
47
+ });
48
+ });
49
+ describe("delete", () => {
50
+ test("should delete a scheduled poll", async () => {
51
+ await controller.register(scheduledPoll);
52
+ const { isScheduled } = await controller.delete(identityScheduledPoll);
53
+ expect(isScheduled).toBe(false);
54
+ });
55
+ test("should throw an error if checking status fails", async () => {
56
+ const errorMessage = "Delete failed";
57
+ service.deleteScheduledPoll.mockRejectedValueOnce(new Error(errorMessage));
58
+ await expect(controller.delete(scheduledPoll)).rejects.toThrow(new HttpException(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR));
59
+ });
60
+ });
61
+ });
62
+ //# sourceMappingURL=scheduler.controller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.controller.test.js","sourceRoot":"","sources":["../../../../ts/scheduler/__tests__/scheduler.controller.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheduler.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.service.test.d.ts","sourceRoot":"","sources":["../../../../ts/scheduler/__tests__/scheduler.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,369 @@
1
+ import { EMode, ESupportedChains, getPoll, isTallied } from "@maci-protocol/sdk";
2
+ import { SchedulerRegistry } from "@nestjs/schedule";
3
+ import { ErrorCodes } from "../../common";
4
+ import { FileService } from "../../file/file.service";
5
+ import { getPollKeyFromObject } from "../../redis/utils";
6
+ import { SessionKeysService } from "../../sessionKeys/sessionKeys.service";
7
+ import { SchedulerService } from "../scheduler.service";
8
+ const scheduledPoll = {
9
+ maciAddress: "0x0",
10
+ pollId: "5",
11
+ mode: EMode.NON_QV,
12
+ chain: ESupportedChains.OptimismSepolia,
13
+ endDate: 1752534000,
14
+ deploymentBlockNumber: 1,
15
+ merged: false,
16
+ proofsGenerated: false,
17
+ };
18
+ jest.mock("@maci-protocol/sdk", () => ({
19
+ ...jest.requireActual("@maci-protocol/sdk"),
20
+ getPoll: jest.fn().mockResolvedValue({
21
+ address: "0x123",
22
+ endDate: 1752534000,
23
+ isMerged: false,
24
+ }),
25
+ isTallied: jest.fn().mockResolvedValue(false),
26
+ }));
27
+ describe("SchedulerService", () => {
28
+ let fileService;
29
+ let sessionKeysService;
30
+ let proofService;
31
+ let redisService;
32
+ let schedulerRegistry;
33
+ let service;
34
+ beforeAll(async () => {
35
+ fileService = new FileService();
36
+ sessionKeysService = new SessionKeysService(fileService);
37
+ // Mock RedisService methods as needed
38
+ redisService = {
39
+ get: jest.fn().mockResolvedValue(JSON.stringify(scheduledPoll)),
40
+ set: jest.fn(),
41
+ delete: jest.fn(),
42
+ getAll: jest.fn().mockResolvedValue([]),
43
+ };
44
+ // Mock ProofGeneratorService methods as needed
45
+ proofService = {
46
+ merge: jest.fn().mockResolvedValue({}),
47
+ generate: jest.fn().mockResolvedValue({}),
48
+ submit: jest.fn().mockResolvedValue({}),
49
+ };
50
+ schedulerRegistry = new SchedulerRegistry();
51
+ service = new SchedulerService(sessionKeysService, redisService, schedulerRegistry, proofService);
52
+ await service.onModuleInit();
53
+ });
54
+ afterAll(() => {
55
+ jest.clearAllMocks();
56
+ });
57
+ afterEach(() => {
58
+ jest.clearAllMocks();
59
+ const timeouts = schedulerRegistry.getTimeouts();
60
+ // Clear all timeouts in the mock scheduler registry
61
+ timeouts.forEach((timeout) => {
62
+ if (timeout.includes("-test")) {
63
+ schedulerRegistry.deleteTimeout(timeout);
64
+ }
65
+ });
66
+ });
67
+ describe(`isPollScheduled`, () => {
68
+ test("should return true if poll is saved, scheduled and not tallied", async () => {
69
+ await service.registerPoll(scheduledPoll);
70
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
71
+ expect(isPollScheduled.isScheduled).toBe(true);
72
+ });
73
+ test("should return false if poll is not saved", async () => {
74
+ redisService.get.mockResolvedValueOnce(null);
75
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
76
+ expect(isPollScheduled.isScheduled).toBe(false);
77
+ });
78
+ test("should return false if poll is saved and timeout not scheduled", async () => {
79
+ await service.registerPoll(scheduledPoll);
80
+ schedulerRegistry.deleteTimeout(getPollKeyFromObject(scheduledPoll));
81
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
82
+ expect(isPollScheduled.isScheduled).toBe(false);
83
+ });
84
+ test("should return false if poll is scheduled but not saved", async () => {
85
+ redisService.get.mockResolvedValueOnce(null);
86
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
87
+ expect(isPollScheduled.isScheduled).toBe(false);
88
+ });
89
+ test("should throw an error if poll is already tallied", async () => {
90
+ await service.registerPoll(scheduledPoll);
91
+ getPoll.mockResolvedValueOnce({
92
+ isMerged: true,
93
+ });
94
+ isTallied.mockResolvedValueOnce(true);
95
+ await expect(service.isPollScheduled(scheduledPoll)).rejects.toThrow(ErrorCodes.POLL_ALREADY_TALLIED.toString());
96
+ });
97
+ });
98
+ describe("getPollFinalizationData", () => {
99
+ test("should return the end date and tallied status of a poll", async () => {
100
+ getPoll.mockResolvedValueOnce({
101
+ isMerged: false,
102
+ endDate: scheduledPoll.endDate,
103
+ });
104
+ isTallied.mockResolvedValueOnce(false);
105
+ const { endDate, isPollTallied } = await service.getPollFinalizationData({
106
+ maciAddress: scheduledPoll.maciAddress,
107
+ pollId: scheduledPoll.pollId,
108
+ chain: scheduledPoll.chain,
109
+ });
110
+ expect(endDate).toBe(scheduledPoll.endDate);
111
+ expect(isPollTallied).toBe(false);
112
+ });
113
+ test("should return isPollTallied as false if poll is not merged and is not tallied", async () => {
114
+ getPoll.mockResolvedValueOnce({
115
+ isMerged: false,
116
+ });
117
+ isTallied.mockResolvedValueOnce(false);
118
+ const { isPollTallied } = await service.getPollFinalizationData({
119
+ maciAddress: scheduledPoll.maciAddress,
120
+ pollId: scheduledPoll.pollId,
121
+ chain: scheduledPoll.chain,
122
+ });
123
+ expect(isPollTallied).toBe(false);
124
+ });
125
+ test("should return isPollTallied as false if poll is merged and is not tallied", async () => {
126
+ getPoll.mockResolvedValueOnce({
127
+ isMerged: true,
128
+ });
129
+ isTallied.mockResolvedValueOnce(false);
130
+ const { isPollTallied } = await service.getPollFinalizationData({
131
+ maciAddress: scheduledPoll.maciAddress,
132
+ pollId: scheduledPoll.pollId,
133
+ chain: scheduledPoll.chain,
134
+ });
135
+ expect(isPollTallied).toBe(false);
136
+ });
137
+ });
138
+ describe("finalizePoll", () => {
139
+ test("should finalize a poll and delete the scheduled poll (redis and timeout)", async () => {
140
+ await service.finalizePoll(scheduledPoll);
141
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
142
+ const doesExist = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
143
+ expect(isPollScheduled.isScheduled).toBe(false);
144
+ expect(doesExist).toBe(false);
145
+ });
146
+ test("should finalize two polls", async () => {
147
+ const pollOne = { ...scheduledPoll, pollId: "1" };
148
+ const pollTwo = { ...scheduledPoll, pollId: "2" };
149
+ await Promise.all([service.finalizePoll(pollOne), service.finalizePoll(pollTwo)]);
150
+ const isPollScheduledOne = await service.isPollScheduled(pollOne);
151
+ const isPollScheduledTwo = await service.isPollScheduled(pollTwo);
152
+ const doesExistOne = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(pollOne));
153
+ const doesExistTwo = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(pollTwo));
154
+ expect(isPollScheduledOne.isScheduled).toBe(false);
155
+ expect(isPollScheduledTwo.isScheduled).toBe(false);
156
+ expect(doesExistOne).toBe(false);
157
+ expect(doesExistTwo).toBe(false);
158
+ });
159
+ test("should finalize a poll that has been merged and saved as merged in database", async () => {
160
+ getPoll.mockResolvedValueOnce({
161
+ isMerged: true,
162
+ });
163
+ await service.finalizePoll({ ...scheduledPoll, merged: true });
164
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
165
+ const doesExist = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
166
+ expect(isPollScheduled.isScheduled).toBe(false);
167
+ expect(doesExist).toBe(false);
168
+ });
169
+ test("should finalize a poll that has proofs generated and saved as proofsGenerated in database", async () => {
170
+ getPoll.mockResolvedValueOnce({
171
+ isMerged: true,
172
+ });
173
+ await service.finalizePoll({ ...scheduledPoll, merged: true, proofsGenerated: true });
174
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
175
+ const doesExist = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
176
+ expect(isPollScheduled.isScheduled).toBe(false);
177
+ expect(doesExist).toBe(false);
178
+ });
179
+ test("should reschedule a poll if database says is not merged but it has been merged", async () => {
180
+ proofService.merge.mockRejectedValueOnce(new Error("Poll already merged"));
181
+ await service.registerPoll({ ...scheduledPoll, merged: false });
182
+ await service.finalizePoll(scheduledPoll);
183
+ const isPollRescheduled = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
184
+ expect(isPollRescheduled).toBe(true);
185
+ });
186
+ test("should reschedule a poll if database says is merged but it has not been merged", async () => {
187
+ proofService.generate.mockRejectedValueOnce(new Error("Poll not merged"));
188
+ await service.registerPoll({ ...scheduledPoll, merged: true });
189
+ await service.finalizePoll(scheduledPoll);
190
+ const isPollRescheduled = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
191
+ expect(isPollRescheduled).toBe(true);
192
+ });
193
+ test("should reschedule a poll if merge fails", async () => {
194
+ proofService.merge.mockRejectedValueOnce(new Error("Merge failed"));
195
+ await service.finalizePoll(scheduledPoll);
196
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
197
+ const doesExist = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
198
+ expect(isPollScheduled.isScheduled).toBe(true);
199
+ expect(doesExist).toBe(true);
200
+ });
201
+ test("should save merged as true and reschedule if generate proofs fails", async () => {
202
+ proofService.generate.mockRejectedValueOnce(new Error("Proof generation failed"));
203
+ await service.finalizePoll(scheduledPoll);
204
+ // eslint-disable-next-line @typescript-eslint/unbound-method
205
+ expect(redisService.set).toHaveBeenCalledWith(getPollKeyFromObject({
206
+ maciAddress: scheduledPoll.maciAddress,
207
+ pollId: scheduledPoll.pollId,
208
+ chain: scheduledPoll.chain,
209
+ }), JSON.stringify({ ...scheduledPoll, merged: true }));
210
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
211
+ const doesExist = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
212
+ expect(isPollScheduled.isScheduled).toBe(true);
213
+ expect(doesExist).toBe(true);
214
+ });
215
+ test("should save proofsGenerated as true and reschedule if submit fails", async () => {
216
+ proofService.submit.mockRejectedValueOnce(new Error("Proof submission failed"));
217
+ await service.finalizePoll(scheduledPoll);
218
+ // after merge executed correctly
219
+ // eslint-disable-next-line @typescript-eslint/unbound-method
220
+ expect(redisService.set).toHaveBeenNthCalledWith(1, getPollKeyFromObject({
221
+ maciAddress: scheduledPoll.maciAddress,
222
+ pollId: scheduledPoll.pollId,
223
+ chain: scheduledPoll.chain,
224
+ }), JSON.stringify({ ...scheduledPoll, merged: true }));
225
+ // after generate proofs executed correctly
226
+ // eslint-disable-next-line @typescript-eslint/unbound-method
227
+ expect(redisService.set).toHaveBeenNthCalledWith(2, getPollKeyFromObject({
228
+ maciAddress: scheduledPoll.maciAddress,
229
+ pollId: scheduledPoll.pollId,
230
+ chain: scheduledPoll.chain,
231
+ }), JSON.stringify({ ...scheduledPoll, merged: true, proofsGenerated: true }));
232
+ // after submit failed
233
+ // eslint-disable-next-line @typescript-eslint/unbound-method
234
+ expect(redisService.set).toHaveBeenNthCalledWith(3, getPollKeyFromObject({
235
+ maciAddress: scheduledPoll.maciAddress,
236
+ pollId: scheduledPoll.pollId,
237
+ chain: scheduledPoll.chain,
238
+ }), JSON.stringify({ ...scheduledPoll, merged: true, proofsGenerated: true }));
239
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
240
+ const doesExist = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
241
+ expect(isPollScheduled.isScheduled).toBe(true);
242
+ expect(doesExist).toBe(true);
243
+ });
244
+ });
245
+ describe("registerPoll", () => {
246
+ test("should register a poll for finalization", async () => {
247
+ const { isScheduled } = await service.registerPoll(scheduledPoll);
248
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
249
+ const isPollTimeoutScheduled = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(scheduledPoll));
250
+ expect(isScheduled).toBe(true);
251
+ expect(isPollScheduled.isScheduled).toBe(true);
252
+ expect(isPollTimeoutScheduled).toBe(true);
253
+ });
254
+ test("should register 2 polls and schedule their finalization", async () => {
255
+ const pollOne = { ...scheduledPoll, pollId: "1" };
256
+ const pollTwo = { ...scheduledPoll, pollId: "2" };
257
+ const { isScheduled: isScheduledOne } = await service.registerPoll(pollOne);
258
+ const { isScheduled: isScheduledTwo } = await service.registerPoll(pollTwo);
259
+ const [isPollScheduledOne, isPollScheduledTwo] = await Promise.all([
260
+ service.isPollScheduled(pollOne),
261
+ service.isPollScheduled(pollTwo),
262
+ ]);
263
+ const isPollOneTimeoutScheduled = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(pollOne));
264
+ const isPollTwoTimeoutScheduled = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(pollTwo));
265
+ expect(isScheduledOne).toBe(true);
266
+ expect(isScheduledTwo).toBe(true);
267
+ expect(isPollScheduledOne.isScheduled).toBe(true);
268
+ expect(isPollScheduledTwo.isScheduled).toBe(true);
269
+ expect(isPollOneTimeoutScheduled).toBe(true);
270
+ expect(isPollTwoTimeoutScheduled).toBe(true);
271
+ });
272
+ test("should schedule finalization after the poll has ended", async () => {
273
+ const endedPoll = { ...scheduledPoll, endDate: 1 };
274
+ const { isScheduled } = await service.registerPoll(endedPoll);
275
+ const isPollScheduled = await service.isPollScheduled(endedPoll);
276
+ const isPollTimeoutScheduled = schedulerRegistry.doesExist("timeout", getPollKeyFromObject(endedPoll));
277
+ expect(isScheduled).toBe(true);
278
+ expect(isPollScheduled.isScheduled).toBe(true);
279
+ expect(isPollTimeoutScheduled).toBe(true);
280
+ });
281
+ test("should throw an error if poll is already tallied", async () => {
282
+ getPoll.mockResolvedValueOnce({
283
+ isMerged: true,
284
+ });
285
+ isTallied.mockResolvedValueOnce(true);
286
+ await expect(service.registerPoll(scheduledPoll)).rejects.toThrow(ErrorCodes.POLL_ALREADY_TALLIED.toString());
287
+ });
288
+ test("should throw an error if poll is already scheduled", async () => {
289
+ await service.registerPoll(scheduledPoll);
290
+ await expect(service.registerPoll(scheduledPoll)).rejects.toThrow(ErrorCodes.POLL_ALREADY_SCHEDULED.toString());
291
+ });
292
+ });
293
+ describe("deleteScheduledPoll", () => {
294
+ test("should delete a scheduled poll", async () => {
295
+ await service.registerPoll(scheduledPoll);
296
+ const isPollScheduled = await service.isPollScheduled(scheduledPoll);
297
+ const { isScheduled } = await service.deleteScheduledPoll(scheduledPoll);
298
+ const isPollDeleted = await service.isPollScheduled(scheduledPoll);
299
+ expect(isPollScheduled.isScheduled).toBe(true);
300
+ expect(isScheduled).toBe(false);
301
+ expect(isPollDeleted.isScheduled).toBe(false);
302
+ });
303
+ test("should return isPollScheduled as false if poll was not scheduled", async () => {
304
+ const { isScheduled } = await service.deleteScheduledPoll(scheduledPoll);
305
+ expect(isScheduled).toBe(false);
306
+ });
307
+ });
308
+ describe("restoreTimeouts", () => {
309
+ const polls = [
310
+ { ...scheduledPoll, pollId: "1" },
311
+ { ...scheduledPoll, pollId: "2" },
312
+ { ...scheduledPoll, pollId: "3" },
313
+ ];
314
+ beforeEach(async () => {
315
+ await Promise.all([
316
+ service.registerPoll(polls[0]),
317
+ service.registerPoll(polls[1]),
318
+ service.registerPoll(polls[2]),
319
+ ]);
320
+ schedulerRegistry.deleteTimeout(getPollKeyFromObject(polls[0]));
321
+ schedulerRegistry.deleteTimeout(getPollKeyFromObject(polls[1]));
322
+ schedulerRegistry.deleteTimeout(getPollKeyFromObject(polls[2]));
323
+ redisService.getAll.mockResolvedValue(polls.map((poll) => ({
324
+ key: getPollKeyFromObject(poll),
325
+ value: JSON.stringify(poll),
326
+ })));
327
+ redisService.get.mockImplementation((key) => {
328
+ const poll = polls.find((p) => getPollKeyFromObject(p) === key);
329
+ const result = poll ? JSON.stringify(poll) : null;
330
+ return Promise.resolve(result);
331
+ });
332
+ });
333
+ afterEach(() => {
334
+ jest.clearAllMocks();
335
+ getPoll.mockReset().mockResolvedValue({
336
+ address: "0x123",
337
+ endDate: 1752534000,
338
+ isMerged: false,
339
+ });
340
+ isTallied.mockReset().mockResolvedValue(false);
341
+ });
342
+ test("should restore scheduled polls from Redis", async () => {
343
+ await service.onModuleInit();
344
+ const timeouts = schedulerRegistry.getTimeouts();
345
+ timeouts.forEach((timeout, i) => {
346
+ expect(timeout).toBe(getPollKeyFromObject(polls[i]));
347
+ });
348
+ expect(timeouts.length).toBe(polls.length);
349
+ });
350
+ test("should not restore timeouts for tallied polls", async () => {
351
+ getPoll.mockImplementation(({ pollId }) => Promise.resolve({ isMerged: pollId === 2n }));
352
+ isTallied.mockImplementation(({ pollId }) => Promise.resolve(pollId === "2"));
353
+ await service.onModuleInit();
354
+ const timeouts = schedulerRegistry.getTimeouts();
355
+ expect(timeouts.length).toBe(polls.length - 1);
356
+ });
357
+ test("should not throw if Redis returns null for a key and should delete register", async () => {
358
+ redisService.getAll.mockResolvedValueOnce([
359
+ { key: getPollKeyFromObject(polls[0]), value: JSON.stringify(polls[0]) },
360
+ { key: getPollKeyFromObject(polls[1]), value: JSON.stringify(polls[1]) },
361
+ // poll 2 is missing
362
+ ]);
363
+ await service.onModuleInit();
364
+ const timeouts = schedulerRegistry.getTimeouts();
365
+ expect(timeouts.length).toBe(polls.length - 1);
366
+ });
367
+ });
368
+ });
369
+ //# sourceMappingURL=scheduler.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.service.test.js","sourceRoot":"","sources":["../../../../ts/scheduler/__tests__/scheduler.service.test.ts"],"names":[],"mappings":"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"}