@maci-protocol/coordinator 0.0.0-ci.db88479 → 0.0.0-ci.de6bbd5

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 (99) hide show
  1. package/README.md +4 -4
  2. package/build/scripts/generateKeypair.js +2 -2
  3. package/build/scripts/generateKeypair.js.map +1 -1
  4. package/build/tests/e2e.deploy.test.js +28 -17
  5. package/build/tests/e2e.deploy.test.js.map +1 -1
  6. package/build/tests/e2e.redis.test.d.ts +2 -0
  7. package/build/tests/e2e.redis.test.d.ts.map +1 -0
  8. package/build/tests/e2e.redis.test.js +119 -0
  9. package/build/tests/e2e.redis.test.js.map +1 -0
  10. package/build/tests/utils.d.ts.map +1 -1
  11. package/build/tests/utils.js.map +1 -1
  12. package/build/ts/app.module.d.ts.map +1 -1
  13. package/build/ts/app.module.js +4 -0
  14. package/build/ts/app.module.js.map +1 -1
  15. package/build/ts/common/__tests__/common.test.js +1 -11
  16. package/build/ts/common/__tests__/common.test.js.map +1 -1
  17. package/build/ts/common/chain.d.ts.map +1 -1
  18. package/build/ts/common/chain.js +4 -3
  19. package/build/ts/common/chain.js.map +1 -1
  20. package/build/ts/common/errors.d.ts +12 -11
  21. package/build/ts/common/errors.d.ts.map +1 -1
  22. package/build/ts/common/errors.js +12 -11
  23. package/build/ts/common/errors.js.map +1 -1
  24. package/build/ts/deployer/__tests__/deployer.controller.test.js +7 -7
  25. package/build/ts/deployer/__tests__/deployer.controller.test.js.map +1 -1
  26. package/build/ts/deployer/__tests__/deployer.service.test.js +71 -11
  27. package/build/ts/deployer/__tests__/deployer.service.test.js.map +1 -1
  28. package/build/ts/deployer/__tests__/utils.d.ts +0 -1
  29. package/build/ts/deployer/__tests__/utils.d.ts.map +1 -1
  30. package/build/ts/deployer/__tests__/utils.js +4 -4
  31. package/build/ts/deployer/__tests__/utils.js.map +1 -1
  32. package/build/ts/deployer/deployer.service.d.ts +17 -7
  33. package/build/ts/deployer/deployer.service.d.ts.map +1 -1
  34. package/build/ts/deployer/deployer.service.js +207 -54
  35. package/build/ts/deployer/deployer.service.js.map +1 -1
  36. package/build/ts/deployer/types.d.ts +18 -11
  37. package/build/ts/deployer/types.d.ts.map +1 -1
  38. package/build/ts/file/file.service.js +2 -2
  39. package/build/ts/file/file.service.js.map +1 -1
  40. package/build/ts/health/__tests__/health.controller.test.d.ts +2 -0
  41. package/build/ts/health/__tests__/health.controller.test.d.ts.map +1 -0
  42. package/build/ts/health/__tests__/health.controller.test.js +28 -0
  43. package/build/ts/health/__tests__/health.controller.test.js.map +1 -0
  44. package/build/ts/health/__tests__/health.service.test.d.ts +2 -0
  45. package/build/ts/health/__tests__/health.service.test.d.ts.map +1 -0
  46. package/build/ts/health/__tests__/health.service.test.js +88 -0
  47. package/build/ts/health/__tests__/health.service.test.js.map +1 -0
  48. package/build/ts/health/health.controller.d.ts +16 -0
  49. package/build/ts/health/health.controller.d.ts.map +1 -0
  50. package/build/ts/health/health.controller.js +43 -0
  51. package/build/ts/health/health.controller.js.map +1 -0
  52. package/build/ts/health/health.module.d.ts +3 -0
  53. package/build/ts/health/health.module.d.ts.map +1 -0
  54. package/build/ts/health/health.module.js +22 -0
  55. package/build/ts/health/health.module.js.map +1 -0
  56. package/build/ts/health/health.service.d.ts +42 -0
  57. package/build/ts/health/health.service.d.ts.map +1 -0
  58. package/build/ts/health/health.service.js +182 -0
  59. package/build/ts/health/health.service.js.map +1 -0
  60. package/build/ts/health/types.d.ts +83 -0
  61. package/build/ts/health/types.d.ts.map +1 -0
  62. package/build/ts/health/types.js +2 -0
  63. package/build/ts/health/types.js.map +1 -0
  64. package/build/ts/proof/__tests__/proof.service.test.js +28 -54
  65. package/build/ts/proof/__tests__/proof.service.test.js.map +1 -1
  66. package/build/ts/redis/__tests__/redis.service.test.d.ts +2 -0
  67. package/build/ts/redis/__tests__/redis.service.test.d.ts.map +1 -0
  68. package/build/ts/redis/__tests__/redis.service.test.js +149 -0
  69. package/build/ts/redis/__tests__/redis.service.test.js.map +1 -0
  70. package/build/ts/redis/redis.module.d.ts +3 -0
  71. package/build/ts/redis/redis.module.d.ts.map +1 -0
  72. package/build/ts/redis/redis.module.js +18 -0
  73. package/build/ts/redis/redis.module.js.map +1 -0
  74. package/build/ts/redis/redis.service.d.ts +52 -0
  75. package/build/ts/redis/redis.service.d.ts.map +1 -0
  76. package/build/ts/redis/redis.service.js +97 -0
  77. package/build/ts/redis/redis.service.js.map +1 -0
  78. package/build/ts/redis/types.d.ts +54 -0
  79. package/build/ts/redis/types.d.ts.map +1 -0
  80. package/build/ts/redis/types.js +2 -0
  81. package/build/ts/redis/types.js.map +1 -0
  82. package/build/ts/redis/utils.d.ts +20 -0
  83. package/build/ts/redis/utils.d.ts.map +1 -0
  84. package/build/ts/redis/utils.js +27 -0
  85. package/build/ts/redis/utils.js.map +1 -0
  86. package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js +2 -2
  87. package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js.map +1 -1
  88. package/build/ts/subgraph/__tests__/subgraph.service.test.js +2 -3
  89. package/build/ts/subgraph/__tests__/subgraph.service.test.js.map +1 -1
  90. package/build/ts/subgraph/subgraph.service.d.ts +4 -0
  91. package/build/ts/subgraph/subgraph.service.d.ts.map +1 -1
  92. package/build/ts/subgraph/subgraph.service.js +16 -5
  93. package/build/ts/subgraph/subgraph.service.js.map +1 -1
  94. package/build/tsconfig.build.tsbuildinfo +1 -1
  95. package/package.json +24 -23
  96. package/build/tests/e2e.aa.test.d.ts +0 -2
  97. package/build/tests/e2e.aa.test.d.ts.map +0 -1
  98. package/build/tests/e2e.aa.test.js +0 -96
  99. package/build/tests/e2e.aa.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maci-protocol/coordinator",
3
- "version": "0.0.0-ci.db88479",
3
+ "version": "0.0.0-ci.de6bbd5",
4
4
  "private": false,
5
5
  "description": "Coordinator service for MACI",
6
6
  "main": "build/ts/main.js",
@@ -22,7 +22,7 @@
22
22
  "run:node": "node --import 'data:text/javascript,import { register } from \"node:module\"; import { pathToFileURL } from \"node:url\"; register(\"ts-node/esm\", pathToFileURL(\"./\"));'",
23
23
  "start": "pnpm run run:node ./ts/main.ts",
24
24
  "start:prod": "pnpm run run:node build/ts/main.js",
25
- "test": "jest --testPathIgnorePatterns=e2e.deploy.test.ts --testPathIgnorePatterns=e2e.test.ts --forceExit",
25
+ "test": "jest --testPathIgnorePatterns=tests/ --forceExit",
26
26
  "test:coverage": "jest --coverage --forceExit",
27
27
  "test:e2e": "jest ./tests/*.test.ts --forceExit --runInBand",
28
28
  "types": "tsc -p tsconfig.json --noEmit",
@@ -31,30 +31,31 @@
31
31
  "get-auth-header": "pnpm run run:node ./scripts/getAuthHeader.ts"
32
32
  },
33
33
  "dependencies": {
34
- "@graphprotocol/graph-cli": "^0.97.0",
35
- "@maci-protocol/contracts": "0.0.0-ci.db88479",
36
- "@maci-protocol/crypto": "0.0.0-ci.db88479",
37
- "@maci-protocol/domainobjs": "0.0.0-ci.db88479",
38
- "@maci-protocol/sdk": "0.0.0-ci.db88479",
39
- "@maci-protocol/subgraph": "0.0.0-ci.db88479",
40
- "@nestjs/common": "^11.1.3",
34
+ "@graphprotocol/graph-cli": "^0.97.1",
35
+ "@maci-protocol/contracts": "0.0.0-ci.de6bbd5",
36
+ "@maci-protocol/crypto": "0.0.0-ci.de6bbd5",
37
+ "@maci-protocol/domainobjs": "0.0.0-ci.de6bbd5",
38
+ "@maci-protocol/sdk": "0.0.0-ci.de6bbd5",
39
+ "@maci-protocol/subgraph": "0.0.0-ci.de6bbd5",
40
+ "@nestjs/common": "^11.1.5",
41
41
  "@nestjs/core": "^11.1.3",
42
- "@nestjs/platform-express": "^11.1.2",
42
+ "@nestjs/platform-express": "^11.1.3",
43
43
  "@nestjs/platform-socket.io": "^11.1.3",
44
44
  "@nestjs/swagger": "^11.2.0",
45
45
  "@nestjs/throttler": "^6.4.0",
46
46
  "@nestjs/websockets": "^11.1.3",
47
47
  "@nomicfoundation/hardhat-ethers": "^3.0.9",
48
- "@nomicfoundation/hardhat-toolbox": "^5.0.0",
48
+ "@nomicfoundation/hardhat-toolbox": "^6.0.0",
49
+ "@redis/client": "^5.6.0",
49
50
  "@zerodev/ecdsa-validator": "5.4.9",
50
- "@zerodev/permissions": "5.5.8",
51
- "@zerodev/sdk": "5.4.34",
51
+ "@zerodev/permissions": "5.5.12",
52
+ "@zerodev/sdk": "5.4.41",
52
53
  "class-transformer": "^0.5.1",
53
54
  "class-validator": "^0.14.2",
54
55
  "date-fns": "^4.1.0",
55
- "dotenv": "^16.5.0",
56
- "ethers": "^6.14.3",
57
- "hardhat": "^2.24.3",
56
+ "dotenv": "^17.2.0",
57
+ "ethers": "^6.15.0",
58
+ "hardhat": "^2.25.0",
58
59
  "helmet": "^8.1.0",
59
60
  "lowdb": "^1.0.0",
60
61
  "mustache": "^4.2.0",
@@ -63,21 +64,21 @@
63
64
  "socket.io": "^4.7.5",
64
65
  "tar": "^7.4.1",
65
66
  "ts-node": "^10.9.1",
66
- "viem": "^2.31.2"
67
+ "viem": "^2.31.7"
67
68
  },
68
69
  "devDependencies": {
69
70
  "@nestjs/cli": "^11.0.7",
70
71
  "@nestjs/schematics": "^11.0.5",
71
72
  "@nestjs/testing": "^11.1.3",
72
73
  "@types/express": "^5.0.3",
73
- "@types/jest": "^29.5.2",
74
+ "@types/jest": "^30.0.0",
74
75
  "@types/lowdb": "^1.0.15",
75
- "@types/node": "^22.15.17",
76
+ "@types/node": "^24.0.13",
76
77
  "@types/supertest": "^6.0.2",
77
- "fast-check": "^4.1.1",
78
- "jest": "^30.0.0",
78
+ "fast-check": "^4.2.0",
79
+ "jest": "^30.0.4",
79
80
  "socket.io-client": "^4.7.5",
80
- "supertest": "^7.1.1",
81
+ "supertest": "^7.1.3",
81
82
  "ts-jest": "^29.4.0",
82
83
  "typescript": "^5.8.3"
83
84
  },
@@ -120,5 +121,5 @@
120
121
  "coverageDirectory": "<rootDir>/coverage",
121
122
  "testEnvironment": "node"
122
123
  },
123
- "gitHead": "e80fce6b90387624be27379a57a1fb5a718fba39"
124
+ "gitHead": "b1ed6c9c3a7dc3ca3081242d67438b96779c285a"
124
125
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=e2e.aa.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.aa.test.d.ts","sourceRoot":"","sources":["../../tests/e2e.aa.test.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- import { sleep } from "@maci-protocol/sdk";
2
- import { zeroAddress } from "viem";
3
- import { ErrorCodes, ESupportedNetworks } from "../ts/common";
4
- import { testMaciDeploymentConfig, testPollDeploymentConfig } from "../ts/deployer/__tests__/utils";
5
- import { DeployerService } from "../ts/deployer/deployer.service";
6
- import { FileService } from "../ts/file/file.service";
7
- import { ProofGeneratorService } from "../ts/proof/proof.service";
8
- import { ENTRY_POINT, generateApproval, KERNEL_VERSION } from "../ts/sessionKeys/__tests__/utils";
9
- import { SessionKeysService } from "../ts/sessionKeys/sessionKeys.service";
10
- describe("E2E Account Abstraction Tests", () => {
11
- const fileService = new FileService();
12
- const sessionKeyService = new SessionKeysService(fileService);
13
- const proofService = new ProofGeneratorService(fileService, sessionKeyService);
14
- const deployerService = new DeployerService(sessionKeyService, fileService);
15
- // using an already deployed maci contract
16
- let maciContract = "";
17
- let pollId;
18
- let approval;
19
- let sessionKeyAddress;
20
- beforeAll(async () => {
21
- sessionKeyAddress = (await sessionKeyService.generateSessionKey()).sessionKeyAddress;
22
- approval = await generateApproval(sessionKeyAddress);
23
- });
24
- describe("deploy", () => {
25
- describe("deployMaci", () => {
26
- it("should deploy all maci related contracts", async () => {
27
- const { address: maciAddress } = await deployerService.deployMaci({
28
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
29
- config: testMaciDeploymentConfig,
30
- });
31
- maciContract = maciAddress;
32
- expect(maciAddress).not.toBe(zeroAddress);
33
- });
34
- });
35
- describe("deployPoll", () => {
36
- it("should deploy a poll", async () => {
37
- const { pollId: poll } = await deployerService.deployPoll({
38
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
39
- config: {
40
- ...testPollDeploymentConfig,
41
- startDate: Math.floor(Date.now() / 1000) + 50,
42
- endDate: Math.floor(Date.now() / 1000) + 85,
43
- },
44
- });
45
- expect(poll).toBeDefined();
46
- pollId = Number.parseInt(poll, 10);
47
- });
48
- });
49
- });
50
- describe("merge", () => {
51
- test("should return true when there are no errors", async () => {
52
- // wait until we can complete a poll
53
- await sleep(90 * 1000); // 50 start + 35 end + 5 seconds of grace time
54
- const merged = await proofService.merge({
55
- maciContractAddress: maciContract,
56
- pollId,
57
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
58
- });
59
- expect(merged).toBe(true);
60
- });
61
- test("should throw when given an invalid pollId", async () => {
62
- const invalidPollId = 50000;
63
- await expect(proofService.merge({
64
- maciContractAddress: maciContract,
65
- pollId: invalidPollId,
66
- chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
67
- })).rejects.toThrow(`MACI contract doesn't have any deployed poll ${invalidPollId}`);
68
- });
69
- });
70
- describe("sessionKeys", () => {
71
- it("should create a client from a session key and an approval", async () => {
72
- const client = await sessionKeyService.generateClientFromSessionKey(sessionKeyAddress, approval, ESupportedNetworks.OPTIMISM_SEPOLIA);
73
- expect(client).toBeDefined();
74
- expect(client.transport.key).toBe("http");
75
- expect(client.key).toBe("Account");
76
- expect(client.account.address).not.toBe(zeroAddress);
77
- expect(client.account.kernelVersion).toBe(KERNEL_VERSION);
78
- expect(client.account.entryPoint.version).toBe(ENTRY_POINT.version);
79
- // this is an account with limited permissions so no sudo validator
80
- expect(client.account.kernelPluginManager.address).toBe(zeroAddress);
81
- expect(client.account.kernelPluginManager.sudoValidator).toBe(undefined);
82
- // send a transaction
83
- const tx = await client.sendTransaction({
84
- to: zeroAddress,
85
- value: 0n,
86
- data: "0x",
87
- });
88
- expect(tx.length).toBeGreaterThan(0);
89
- });
90
- it("should not allow to create a client after the session key has been deactivated", async () => {
91
- sessionKeyService.deactivateSessionKey(sessionKeyAddress);
92
- await expect(sessionKeyService.generateClientFromSessionKey(sessionKeyAddress, approval, ESupportedNetworks.OPTIMISM_SEPOLIA)).rejects.toThrow(ErrorCodes.SESSION_KEY_NOT_FOUND.toString());
93
- });
94
- });
95
- });
96
- //# sourceMappingURL=e2e.aa.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.aa.test.js","sourceRoot":"","sources":["../../tests/e2e.aa.test.ts"],"names":[],"mappings":"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"}