@maci-protocol/coordinator 0.0.0-ci.6ccbb3c → 0.0.0-ci.6f654a0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -2
- package/README.md +31 -6
- package/build/hardhat.config.cjs +3 -0
- package/build/hardhat.config.cjs.map +1 -1
- package/build/hardhat.config.d.cts +3 -0
- package/build/tests/constants.d.ts +0 -1
- package/build/tests/constants.d.ts.map +1 -1
- package/build/tests/constants.js +0 -1
- package/build/tests/constants.js.map +1 -1
- package/build/tests/e2e.aa.test.js +18 -25
- package/build/tests/e2e.aa.test.js.map +1 -1
- package/build/tests/e2e.deploy.test.js +120 -77
- package/build/tests/e2e.deploy.test.js.map +1 -1
- package/build/tests/utils.d.ts +6 -0
- package/build/tests/utils.d.ts.map +1 -1
- package/build/tests/utils.js +12 -3
- package/build/tests/utils.js.map +1 -1
- package/build/ts/common/__tests__/common.test.js +9 -13
- package/build/ts/common/__tests__/common.test.js.map +1 -1
- package/build/ts/common/accountAbstraction.d.ts +2 -19
- package/build/ts/common/accountAbstraction.d.ts.map +1 -1
- package/build/ts/common/accountAbstraction.js +15 -44
- package/build/ts/common/accountAbstraction.js.map +1 -1
- package/build/ts/common/chain.d.ts +16 -0
- package/build/ts/common/chain.d.ts.map +1 -0
- package/build/ts/common/chain.js +32 -0
- package/build/ts/common/chain.js.map +1 -0
- package/build/ts/common/coordinatorKeypair.d.ts +7 -0
- package/build/ts/common/coordinatorKeypair.d.ts.map +1 -0
- package/build/ts/common/coordinatorKeypair.js +14 -0
- package/build/ts/common/coordinatorKeypair.js.map +1 -0
- package/build/ts/common/errors.d.ts +17 -18
- package/build/ts/common/errors.d.ts.map +1 -1
- package/build/ts/common/errors.js +17 -18
- package/build/ts/common/errors.js.map +1 -1
- package/build/ts/common/index.d.ts +2 -0
- package/build/ts/common/index.d.ts.map +1 -1
- package/build/ts/common/index.js +2 -0
- package/build/ts/common/index.js.map +1 -1
- package/build/ts/common/types.d.ts +2 -3
- package/build/ts/common/types.d.ts.map +1 -1
- package/build/ts/deployer/__tests__/deployer.service.test.js +28 -287
- package/build/ts/deployer/__tests__/deployer.service.test.js.map +1 -1
- package/build/ts/deployer/__tests__/utils.d.ts +27 -1
- package/build/ts/deployer/__tests__/utils.d.ts.map +1 -1
- package/build/ts/deployer/__tests__/utils.js +39 -10
- package/build/ts/deployer/__tests__/utils.js.map +1 -1
- package/build/ts/deployer/deployer.service.d.ts +15 -51
- package/build/ts/deployer/deployer.service.d.ts.map +1 -1
- package/build/ts/deployer/deployer.service.js +164 -459
- package/build/ts/deployer/deployer.service.js.map +1 -1
- package/build/ts/deployer/dto.d.ts +4 -4
- package/build/ts/deployer/dto.d.ts.map +1 -1
- package/build/ts/deployer/dto.js +9 -1
- package/build/ts/deployer/dto.js.map +1 -1
- package/build/ts/deployer/types.d.ts +48 -21
- package/build/ts/deployer/types.d.ts.map +1 -1
- package/build/ts/file/__tests__/file.service.test.js +12 -11
- package/build/ts/file/__tests__/file.service.test.js.map +1 -1
- package/build/ts/file/file.service.d.ts +4 -3
- package/build/ts/file/file.service.d.ts.map +1 -1
- package/build/ts/file/file.service.js +14 -9
- package/build/ts/file/file.service.js.map +1 -1
- package/build/ts/file/types.d.ts +2 -2
- package/build/ts/file/types.d.ts.map +1 -1
- package/build/ts/proof/__tests__/proof.controller.test.js +5 -3
- package/build/ts/proof/__tests__/proof.controller.test.js.map +1 -1
- package/build/ts/proof/__tests__/proof.gateway.test.js +6 -3
- package/build/ts/proof/__tests__/proof.gateway.test.js.map +1 -1
- package/build/ts/proof/__tests__/proof.service.test.js +13 -26
- package/build/ts/proof/__tests__/proof.service.test.js.map +1 -1
- package/build/ts/proof/dto.d.ts +13 -15
- package/build/ts/proof/dto.d.ts.map +1 -1
- package/build/ts/proof/dto.js +51 -44
- package/build/ts/proof/dto.js.map +1 -1
- package/build/ts/proof/proof.controller.d.ts +3 -2
- package/build/ts/proof/proof.controller.d.ts.map +1 -1
- package/build/ts/proof/proof.controller.js +1 -4
- package/build/ts/proof/proof.controller.js.map +1 -1
- package/build/ts/proof/proof.service.d.ts +4 -6
- package/build/ts/proof/proof.service.d.ts.map +1 -1
- package/build/ts/proof/proof.service.js +48 -130
- package/build/ts/proof/proof.service.js.map +1 -1
- package/build/ts/proof/types.d.ts +19 -14
- package/build/ts/proof/types.d.ts.map +1 -1
- package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts +53 -0
- package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts.map +1 -0
- package/build/ts/sessionKeys/provider/KernelEIP1193Provider.js +105 -0
- package/build/ts/sessionKeys/provider/KernelEIP1193Provider.js.map +1 -0
- package/build/ts/sessionKeys/sessionKeys.service.d.ts +13 -2
- package/build/ts/sessionKeys/sessionKeys.service.d.ts.map +1 -1
- package/build/ts/sessionKeys/sessionKeys.service.js +22 -4
- package/build/ts/sessionKeys/sessionKeys.service.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +26 -26
- package/build/ts/deployer/utils.d.ts +0 -8
- package/build/ts/deployer/utils.d.ts.map +0 -1
- package/build/ts/deployer/utils.js +0 -9
- 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)
|
|
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,23 @@
|
|
|
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
|
+
## 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
|
+
|
|
5
11
|
## Instructions
|
|
6
12
|
|
|
7
13
|
1. Add `.env` file (see `.env.example`).
|
|
8
|
-
2.
|
|
9
|
-
3.
|
|
10
|
-
4.
|
|
11
|
-
5.
|
|
12
|
-
6.
|
|
14
|
+
2. Remember to set up the rapidsnark file variable.
|
|
15
|
+
3. Generate RSA key pair with `pnpm run generate-keypair`.
|
|
16
|
+
4. Download zkey files using `pnpm run download-zkeys:{type}` (only test type is available for now).
|
|
17
|
+
5. 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`.
|
|
18
|
+
6. Run `pnpm run start` to run the service.
|
|
19
|
+
7. 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
20
|
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
|
-
|
|
21
|
+
8. 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)).
|
|
15
22
|
|
|
16
23
|
## Subgraph deployment
|
|
17
24
|
|
|
@@ -40,3 +47,21 @@ After deployment, subgraph url will be available in studio dashboard and you can
|
|
|
40
47
|
```
|
|
41
48
|
https://api.studio.thegraph.com/.../{SUBGRAPH_NAME}/version/latest
|
|
42
49
|
```
|
|
50
|
+
|
|
51
|
+
## Docker
|
|
52
|
+
|
|
53
|
+
Remember to run it from the monorepo root directory.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Build docker
|
|
57
|
+
docker-compose -f apps/coordinator/docker-compose.yml build
|
|
58
|
+
|
|
59
|
+
# Run container detached
|
|
60
|
+
docker-compose -f apps/coordinator/docker-compose.yml up -d
|
|
61
|
+
|
|
62
|
+
# Enter the container
|
|
63
|
+
docker-compose -f apps/coordinator/docker-compose.yml exec coordinator-service /bin/sh
|
|
64
|
+
|
|
65
|
+
# Stop container
|
|
66
|
+
docker-compose -f apps/coordinator/docker-compose.yml down
|
|
67
|
+
```
|
package/build/hardhat.config.cjs
CHANGED
|
@@ -23,6 +23,9 @@ module.exports = {
|
|
|
23
23
|
loggingEnabled: false,
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
|
+
solidity: {
|
|
27
|
+
version: "0.8.28",
|
|
28
|
+
},
|
|
26
29
|
paths: {
|
|
27
30
|
sources: path.resolve(__dirname, parentDir, "./node_modules/@maci-protocol/sdk/node_modules/@maci-protocol/contracts/contracts"),
|
|
28
31
|
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,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,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"}
|
|
@@ -4,5 +4,4 @@ export declare const testPollJoiningWitnessPath = "./zkeys/PollJoining_10_test/P
|
|
|
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
|
|
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"}
|
package/build/tests/constants.js
CHANGED
|
@@ -6,5 +6,4 @@ export const testPollJoiningWitnessPath = "./zkeys/PollJoining_10_test/PollJoini
|
|
|
6
6
|
export const testRapidsnarkPath = `${homedir()}/rapidsnark/build/prover`;
|
|
7
7
|
export const zeroUint256Encoded = AbiCoder.defaultAbiCoder().encode(["uint256"], [0]);
|
|
8
8
|
export const oneUint256Encoded = AbiCoder.defaultAbiCoder().encode(["uint256"], [1]);
|
|
9
|
-
export const pollDuration = 10; // 100 seconds (added to unix timestamp of start date)
|
|
10
9
|
//# 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
|
|
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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { sleep } from "@maci-protocol/sdk";
|
|
1
2
|
import { zeroAddress } from "viem";
|
|
2
3
|
import { ErrorCodes, ESupportedNetworks } from "../ts/common";
|
|
3
|
-
import { CryptoService } from "../ts/crypto/crypto.service";
|
|
4
4
|
import { testMaciDeploymentConfig, testPollDeploymentConfig } from "../ts/deployer/__tests__/utils";
|
|
5
5
|
import { DeployerService } from "../ts/deployer/deployer.service";
|
|
6
6
|
import { FileService } from "../ts/file/file.service";
|
|
@@ -10,68 +10,61 @@ import { SessionKeysService } from "../ts/sessionKeys/sessionKeys.service";
|
|
|
10
10
|
describe("E2E Account Abstraction Tests", () => {
|
|
11
11
|
const fileService = new FileService();
|
|
12
12
|
const sessionKeyService = new SessionKeysService(fileService);
|
|
13
|
-
const
|
|
14
|
-
const proofService = new ProofGeneratorService(cryptoService, fileService, sessionKeyService);
|
|
13
|
+
const proofService = new ProofGeneratorService(fileService, sessionKeyService);
|
|
15
14
|
const deployerService = new DeployerService(sessionKeyService, fileService);
|
|
16
15
|
// using an already deployed maci contract
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
let maciContract = "";
|
|
17
|
+
let pollId;
|
|
19
18
|
let approval;
|
|
20
19
|
let sessionKeyAddress;
|
|
21
20
|
beforeAll(async () => {
|
|
22
|
-
approval = await generateApproval(sessionKeyAddress);
|
|
23
21
|
sessionKeyAddress = (await sessionKeyService.generateSessionKey()).sessionKeyAddress;
|
|
22
|
+
approval = await generateApproval(sessionKeyAddress);
|
|
24
23
|
});
|
|
25
24
|
describe("deploy", () => {
|
|
26
25
|
describe("deployMaci", () => {
|
|
27
26
|
it("should deploy all maci related contracts", async () => {
|
|
28
27
|
const { address: maciAddress } = await deployerService.deployMaci({
|
|
29
|
-
approval,
|
|
30
|
-
sessionKeyAddress,
|
|
31
28
|
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
32
29
|
config: testMaciDeploymentConfig,
|
|
33
30
|
});
|
|
31
|
+
maciContract = maciAddress;
|
|
34
32
|
expect(maciAddress).not.toBe(zeroAddress);
|
|
35
33
|
});
|
|
36
34
|
});
|
|
37
35
|
describe("deployPoll", () => {
|
|
38
36
|
it("should deploy a poll", async () => {
|
|
39
|
-
// Serialize the config with the custom serializer
|
|
40
|
-
const serializedConfig = JSON.stringify(testPollDeploymentConfig);
|
|
41
|
-
const pollConfig = JSON.parse(serializedConfig);
|
|
42
37
|
const { pollId: poll } = await deployerService.deployPoll({
|
|
43
|
-
approval,
|
|
44
|
-
sessionKeyAddress,
|
|
45
38
|
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
46
|
-
config:
|
|
39
|
+
config: {
|
|
40
|
+
...testPollDeploymentConfig,
|
|
41
|
+
startDate: Math.floor(Date.now() / 1000) + 50,
|
|
42
|
+
endDate: Math.floor(Date.now() / 1000) + 85,
|
|
43
|
+
},
|
|
47
44
|
});
|
|
48
45
|
expect(poll).toBeDefined();
|
|
46
|
+
pollId = Number.parseInt(poll, 10);
|
|
49
47
|
});
|
|
50
48
|
});
|
|
51
49
|
});
|
|
52
50
|
describe("merge", () => {
|
|
53
51
|
test("should return true when there are no errors", async () => {
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
// wait until we can complete a poll
|
|
53
|
+
await sleep(90 * 1000); // 50 start + 35 end + 5 seconds of grace time
|
|
56
54
|
const merged = await proofService.merge({
|
|
57
55
|
maciContractAddress: maciContract,
|
|
58
56
|
pollId,
|
|
59
|
-
sessionKeyAddress: sessionKey,
|
|
60
|
-
approval: generatedApproval,
|
|
61
57
|
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
62
58
|
});
|
|
63
59
|
expect(merged).toBe(true);
|
|
64
60
|
});
|
|
65
61
|
test("should throw when given an invalid pollId", async () => {
|
|
66
|
-
const
|
|
67
|
-
const generatedApproval = await generateApproval(sessionKey);
|
|
62
|
+
const invalidPollId = 50000;
|
|
68
63
|
await expect(proofService.merge({
|
|
69
64
|
maciContractAddress: maciContract,
|
|
70
|
-
pollId:
|
|
71
|
-
sessionKeyAddress: sessionKey,
|
|
72
|
-
approval: generatedApproval,
|
|
65
|
+
pollId: invalidPollId,
|
|
73
66
|
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
74
|
-
})).rejects.toThrow(
|
|
67
|
+
})).rejects.toThrow(`MACI contract doesn't have any deployed poll ${invalidPollId}`);
|
|
75
68
|
});
|
|
76
69
|
});
|
|
77
70
|
describe("sessionKeys", () => {
|
|
@@ -82,7 +75,7 @@ describe("E2E Account Abstraction Tests", () => {
|
|
|
82
75
|
expect(client.key).toBe("Account");
|
|
83
76
|
expect(client.account.address).not.toBe(zeroAddress);
|
|
84
77
|
expect(client.account.kernelVersion).toBe(KERNEL_VERSION);
|
|
85
|
-
expect(client.account.entryPoint).toBe(ENTRY_POINT);
|
|
78
|
+
expect(client.account.entryPoint.version).toBe(ENTRY_POINT.version);
|
|
86
79
|
// this is an account with limited permissions so no sudo validator
|
|
87
80
|
expect(client.account.kernelPluginManager.address).toBe(zeroAddress);
|
|
88
81
|
expect(client.account.kernelPluginManager.sudoValidator).toBe(undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e2e.aa.test.js","sourceRoot":"","sources":["../../tests/e2e.aa.test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"e2e.aa.test.js","sourceRoot":"","sources":["../../tests/e2e.aa.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,59 +1,64 @@
|
|
|
1
|
-
// To only run this file: pnpm exec jest --testPathPattern=tests/e2e.deploy.test.ts
|
|
2
|
-
import { generateRandomSalt } from "@maci-protocol/crypto";
|
|
3
1
|
import { Keypair } from "@maci-protocol/domainobjs";
|
|
4
|
-
import {
|
|
2
|
+
import { ContractStorage, isArm, joinPoll, signup, sleep } 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";
|
|
10
|
+
import { ESupportedNetworks, getSigner } from "../ts/common";
|
|
13
11
|
import { getPublicClient } from "../ts/common/accountAbstraction";
|
|
14
|
-
import { testMaciDeploymentConfig, testPollDeploymentConfig } from "../ts/deployer/__tests__/utils";
|
|
12
|
+
import { pollDuration, pollStartDateExtraSeconds, testMaciDeploymentConfig, testPollDeploymentConfig, } from "../ts/deployer/__tests__/utils";
|
|
13
|
+
import { DeployerModule } from "../ts/deployer/deployer.module";
|
|
15
14
|
import { FileModule } from "../ts/file/file.module";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
15
|
+
import { ProofModule } from "../ts/proof/proof.module";
|
|
16
|
+
import { getKernelAccount } from "../ts/sessionKeys/__tests__/utils";
|
|
17
|
+
import { SessionKeysModule } from "../ts/sessionKeys/sessionKeys.module";
|
|
18
|
+
import { pollJoiningTestZkeyPath, testPollJoiningWasmPath, testPollJoiningWitnessPath, testRapidsnarkPath, zeroUint256Encoded, } from "./constants";
|
|
18
19
|
import { getAuthorizationHeader, rechargeGasIfNeeded } from "./utils";
|
|
19
20
|
dotenv.config();
|
|
20
|
-
|
|
21
|
+
jest.setTimeout(700000); // Sets timeout to 700 seconds
|
|
22
|
+
const PORT = process.env.COORDINATOR_PORT || 3000;
|
|
23
|
+
const TEST_URL = `http://localhost:${PORT}/v1`;
|
|
24
|
+
const CHAIN = ESupportedNetworks.OPTIMISM_SEPOLIA;
|
|
25
|
+
const REGEX_SUBGRAPH = /^https:\/\/api\.studio\.thegraph\.com\/query\/\d+\/maci-subgraph\/v0\.0\.\d+$/;
|
|
21
26
|
const NUM_USERS = 1;
|
|
22
|
-
const
|
|
27
|
+
const VOTE_OPTIONS = {
|
|
23
28
|
"0": 0,
|
|
24
29
|
"1": 0,
|
|
25
30
|
};
|
|
26
31
|
describe("E2E Deployment Tests", () => {
|
|
27
32
|
let signer;
|
|
28
33
|
let encryptedHeader;
|
|
29
|
-
let coordinatorKeypair;
|
|
30
34
|
let sessionKeyAddress;
|
|
31
|
-
let approval;
|
|
32
35
|
let app;
|
|
33
36
|
let socket;
|
|
34
|
-
const publicClient = getPublicClient(
|
|
37
|
+
const publicClient = getPublicClient(CHAIN);
|
|
35
38
|
let maciAddress;
|
|
39
|
+
let maciCreatedAt;
|
|
36
40
|
let pollId;
|
|
37
41
|
// set up coordinator address
|
|
38
42
|
beforeAll(async () => {
|
|
39
|
-
|
|
43
|
+
signer = getSigner(CHAIN);
|
|
40
44
|
encryptedHeader = await getAuthorizationHeader(signer);
|
|
41
|
-
coordinatorKeypair = new Keypair();
|
|
42
45
|
process.env.COORDINATOR_ADDRESSES = await signer.getAddress();
|
|
43
46
|
await rechargeGasIfNeeded(process.env.COORDINATOR_ADDRESSES, "0.007", "0.007");
|
|
44
47
|
});
|
|
45
48
|
// set up NestJS app
|
|
46
49
|
beforeAll(async () => {
|
|
47
50
|
const moduleFixture = await Test.createTestingModule({
|
|
48
|
-
imports: [AppModule, FileModule],
|
|
51
|
+
imports: [AppModule, FileModule, DeployerModule, ProofModule, SessionKeysModule],
|
|
49
52
|
}).compile();
|
|
50
53
|
app = moduleFixture.createNestApplication();
|
|
51
54
|
app.useGlobalPipes(new ValidationPipe({ transform: true }));
|
|
52
55
|
await app.init();
|
|
53
|
-
await app.listen(
|
|
56
|
+
await app.listen(PORT);
|
|
54
57
|
});
|
|
55
58
|
afterAll(async () => {
|
|
56
59
|
await app.close();
|
|
60
|
+
const storageInstance = ContractStorage.getInstance(path.join(process.cwd(), "deployed-contracts.json"));
|
|
61
|
+
storageInstance.cleanup(CHAIN);
|
|
57
62
|
});
|
|
58
63
|
// set up auth header in WS connection
|
|
59
64
|
beforeEach(async () => {
|
|
@@ -75,8 +80,17 @@ describe("E2E Deployment Tests", () => {
|
|
|
75
80
|
socket.disconnect();
|
|
76
81
|
});
|
|
77
82
|
// run tests
|
|
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
|
+
// this RSA should be used in the encrypted auth header
|
|
91
|
+
});
|
|
78
92
|
test("should retrieve the session key address", async () => {
|
|
79
|
-
const response = await fetch(`${
|
|
93
|
+
const response = await fetch(`${TEST_URL}/session-keys/generate`, {
|
|
80
94
|
method: "GET",
|
|
81
95
|
headers: {
|
|
82
96
|
Authorization: encryptedHeader,
|
|
@@ -87,27 +101,26 @@ describe("E2E Deployment Tests", () => {
|
|
|
87
101
|
expect(body.sessionKeyAddress).not.toBe(zeroAddress);
|
|
88
102
|
// save them for next tests
|
|
89
103
|
sessionKeyAddress = body.sessionKeyAddress;
|
|
90
|
-
approval = await generateApproval(sessionKeyAddress);
|
|
91
104
|
const sessionKeyAccount = await getKernelAccount(sessionKeyAddress);
|
|
92
105
|
await rechargeGasIfNeeded(sessionKeyAccount.address, "0.03", "0.03");
|
|
93
106
|
});
|
|
94
107
|
test("should deploy MACI correctly", async () => {
|
|
95
108
|
const config = testMaciDeploymentConfig;
|
|
96
109
|
config.VerifyingKeysRegistry.args.stateTreeDepth = config.VerifyingKeysRegistry.args.stateTreeDepth.toString();
|
|
97
|
-
config.VerifyingKeysRegistry.args.
|
|
98
|
-
config.VerifyingKeysRegistry.args.
|
|
110
|
+
config.VerifyingKeysRegistry.args.pollStateTreeDepth =
|
|
111
|
+
config.VerifyingKeysRegistry.args.pollStateTreeDepth.toString();
|
|
112
|
+
config.VerifyingKeysRegistry.args.tallyProcessingStateTreeDepth =
|
|
113
|
+
config.VerifyingKeysRegistry.args.tallyProcessingStateTreeDepth.toString();
|
|
99
114
|
config.VerifyingKeysRegistry.args.voteOptionTreeDepth =
|
|
100
115
|
config.VerifyingKeysRegistry.args.voteOptionTreeDepth.toString();
|
|
101
|
-
const response = await fetch(`${
|
|
116
|
+
const response = await fetch(`${TEST_URL}/deploy/maci`, {
|
|
102
117
|
method: "POST",
|
|
103
118
|
headers: {
|
|
104
119
|
Authorization: encryptedHeader,
|
|
105
120
|
"Content-Type": "application/json",
|
|
106
121
|
},
|
|
107
122
|
body: JSON.stringify({
|
|
108
|
-
|
|
109
|
-
sessionKeyAddress,
|
|
110
|
-
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
123
|
+
chain: CHAIN,
|
|
111
124
|
config,
|
|
112
125
|
}),
|
|
113
126
|
});
|
|
@@ -115,25 +128,24 @@ describe("E2E Deployment Tests", () => {
|
|
|
115
128
|
expect(response.status).toBe(201);
|
|
116
129
|
expect(body.address).not.toBe(zeroAddress);
|
|
117
130
|
// save them for next tests
|
|
131
|
+
const blockNumber = await publicClient.getBlockNumber();
|
|
132
|
+
maciCreatedAt = blockNumber;
|
|
118
133
|
maciAddress = body.address;
|
|
119
134
|
});
|
|
120
135
|
test("should deploy a poll correctly", async () => {
|
|
121
136
|
const config = testPollDeploymentConfig;
|
|
122
|
-
config.coordinatorPublicKey = coordinatorKeypair.publicKey.serialize();
|
|
123
137
|
config.voteOptions = config.voteOptions.toString();
|
|
124
|
-
const startDate = Math.floor(Date.now() / 1000) +
|
|
138
|
+
const startDate = Math.floor(Date.now() / 1000) + pollStartDateExtraSeconds;
|
|
125
139
|
config.startDate = startDate;
|
|
126
140
|
config.endDate = startDate + pollDuration;
|
|
127
|
-
const response = await fetch(`${
|
|
141
|
+
const response = await fetch(`${TEST_URL}/deploy/poll`, {
|
|
128
142
|
method: "POST",
|
|
129
143
|
headers: {
|
|
130
144
|
Authorization: encryptedHeader,
|
|
131
145
|
"Content-Type": "application/json",
|
|
132
146
|
},
|
|
133
147
|
body: JSON.stringify({
|
|
134
|
-
|
|
135
|
-
sessionKeyAddress,
|
|
136
|
-
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
148
|
+
chain: CHAIN,
|
|
137
149
|
config,
|
|
138
150
|
}),
|
|
139
151
|
});
|
|
@@ -143,36 +155,14 @@ describe("E2E Deployment Tests", () => {
|
|
|
143
155
|
// save them for next tests
|
|
144
156
|
pollId = BigInt(body.pollId);
|
|
145
157
|
});
|
|
146
|
-
test("should deploy a subgraph correctly", async () => {
|
|
147
|
-
const blockNumber = Number(await publicClient.getBlockNumber());
|
|
148
|
-
const response = await fetch(`${LOCALHOST}/v1/subgraph/deploy`, {
|
|
149
|
-
method: "POST",
|
|
150
|
-
headers: {
|
|
151
|
-
Authorization: encryptedHeader,
|
|
152
|
-
"Content-Type": "application/json",
|
|
153
|
-
},
|
|
154
|
-
body: JSON.stringify({
|
|
155
|
-
maciContractAddress: maciAddress,
|
|
156
|
-
startBlock: blockNumber,
|
|
157
|
-
network: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
158
|
-
name: process.env.SUBGRAPH_NAME,
|
|
159
|
-
tag: `v0.0.${blockNumber}`, // different versions per test using block number
|
|
160
|
-
}),
|
|
161
|
-
});
|
|
162
|
-
const body = (await response.json());
|
|
163
|
-
const { url } = body;
|
|
164
|
-
const regex = /^https:\/\/api\.studio\.thegraph\.com\/query\/\d+\/maci-subgraph\/v0\.0\.\d+$/;
|
|
165
|
-
expect(response.status).toBe(201);
|
|
166
|
-
expect(body.url).toBeDefined();
|
|
167
|
-
expect(regex.test(url)).toBe(true);
|
|
168
|
-
});
|
|
169
158
|
test("should allow voting on a poll", async () => {
|
|
159
|
+
await sleep(pollStartDateExtraSeconds * 1000);
|
|
170
160
|
for (let i = 0; i < NUM_USERS; i += 1) {
|
|
171
161
|
const keypairUser = new Keypair();
|
|
172
162
|
const userPublicKey = keypairUser.publicKey.serialize();
|
|
173
163
|
const userPrivateKey = keypairUser.privateKey.serialize();
|
|
174
164
|
const vote = i % 2;
|
|
175
|
-
|
|
165
|
+
VOTE_OPTIONS[String(vote)] += 1;
|
|
176
166
|
// user signs up to MACI
|
|
177
167
|
// eslint-disable-next-line no-await-in-loop
|
|
178
168
|
await signup({
|
|
@@ -186,48 +176,101 @@ describe("E2E Deployment Tests", () => {
|
|
|
186
176
|
await joinPoll({
|
|
187
177
|
maciAddress,
|
|
188
178
|
privateKey: userPrivateKey,
|
|
189
|
-
stateIndex: 1n,
|
|
190
179
|
pollId: BigInt(pollId),
|
|
191
180
|
pollJoiningZkey: pollJoiningTestZkeyPath,
|
|
192
181
|
useWasm: true,
|
|
193
182
|
pollWasm: testPollJoiningWasmPath,
|
|
194
|
-
|
|
183
|
+
pollWitnessGenerator: testPollJoiningWitnessPath,
|
|
195
184
|
rapidsnark: testRapidsnarkPath,
|
|
196
185
|
sgDataArg: zeroUint256Encoded,
|
|
197
186
|
ivcpDataArg: zeroUint256Encoded,
|
|
198
187
|
signer,
|
|
199
188
|
});
|
|
200
|
-
// user publishes a vote
|
|
201
|
-
// eslint-disable-next-line no-await-in-loop
|
|
202
|
-
const publishData = await publish({
|
|
203
|
-
publicKey: userPublicKey,
|
|
204
|
-
stateIndex: 1n,
|
|
205
|
-
voteOptionIndex: BigInt(vote),
|
|
206
|
-
nonce: 1n,
|
|
207
|
-
pollId: BigInt(pollId),
|
|
208
|
-
newVoteWeight: 1n,
|
|
209
|
-
maciAddress,
|
|
210
|
-
salt: generateRandomSalt(),
|
|
211
|
-
privateKey: userPrivateKey,
|
|
212
|
-
signer,
|
|
213
|
-
});
|
|
214
|
-
expect(publishData.hash).not.toBe(zeroAddress);
|
|
215
189
|
}
|
|
216
190
|
});
|
|
191
|
+
test("should deploy a subgraph correctly", async () => {
|
|
192
|
+
const response = await fetch(`${TEST_URL}/subgraph/deploy`, {
|
|
193
|
+
method: "POST",
|
|
194
|
+
headers: {
|
|
195
|
+
Authorization: encryptedHeader,
|
|
196
|
+
"Content-Type": "application/json",
|
|
197
|
+
},
|
|
198
|
+
body: JSON.stringify({
|
|
199
|
+
maciContractAddress: maciAddress,
|
|
200
|
+
startBlock: Number(maciCreatedAt),
|
|
201
|
+
network: CHAIN,
|
|
202
|
+
name: process.env.SUBGRAPH_NAME,
|
|
203
|
+
tag: `v0.0.${maciCreatedAt}`, // different versions per test using block number
|
|
204
|
+
}),
|
|
205
|
+
});
|
|
206
|
+
const body = await response.json();
|
|
207
|
+
if (response.status === 400) {
|
|
208
|
+
const errorMessage = body.message;
|
|
209
|
+
if (errorMessage.includes("api.thegraph.com | 502: Bad gateway")) {
|
|
210
|
+
// eslint-disable-next-line no-console
|
|
211
|
+
console.info("It looks like there was a problem with The Graph endpoint. We are passing this test.");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const { url } = body;
|
|
216
|
+
expect(response.status).toBe(201);
|
|
217
|
+
expect(url).toBeDefined();
|
|
218
|
+
expect(REGEX_SUBGRAPH.test(url)).toBe(true);
|
|
219
|
+
});
|
|
217
220
|
test("should merge correctly", async () => {
|
|
218
|
-
await sleep(
|
|
219
|
-
const response = await fetch(`${
|
|
221
|
+
await sleep(pollDuration * 1000);
|
|
222
|
+
const response = await fetch(`${TEST_URL}/proof/merge`, {
|
|
223
|
+
method: "POST",
|
|
224
|
+
headers: {
|
|
225
|
+
Authorization: encryptedHeader,
|
|
226
|
+
"Content-Type": "application/json",
|
|
227
|
+
},
|
|
228
|
+
body: JSON.stringify({
|
|
229
|
+
maciContractAddress: maciAddress,
|
|
230
|
+
pollId: Number(pollId),
|
|
231
|
+
chain: CHAIN,
|
|
232
|
+
}),
|
|
233
|
+
});
|
|
234
|
+
expect(response.status).toBe(201);
|
|
235
|
+
});
|
|
236
|
+
test("should generate proofs correctly", async () => {
|
|
237
|
+
const useWasm = isArm(); // Use WASM on ARM devices, otherwise use rapidsnark
|
|
238
|
+
const response = await fetch(`${TEST_URL}/proof/generate`, {
|
|
220
239
|
method: "POST",
|
|
221
240
|
headers: {
|
|
222
241
|
Authorization: encryptedHeader,
|
|
223
242
|
"Content-Type": "application/json",
|
|
224
243
|
},
|
|
225
244
|
body: JSON.stringify({
|
|
245
|
+
poll: Number(pollId),
|
|
226
246
|
maciContractAddress: maciAddress,
|
|
247
|
+
mode: testPollDeploymentConfig.mode,
|
|
248
|
+
startBlock: Number(maciCreatedAt),
|
|
249
|
+
blocksPerBatch: 500,
|
|
250
|
+
chain: CHAIN,
|
|
251
|
+
useWasm,
|
|
252
|
+
}),
|
|
253
|
+
});
|
|
254
|
+
const body = (await response.json());
|
|
255
|
+
expect(response.status).toBe(201);
|
|
256
|
+
expect(body.processProofs).toBeDefined();
|
|
257
|
+
expect(body.processProofs.length).toBeGreaterThan(0);
|
|
258
|
+
expect(body.tallyProofs).toBeDefined();
|
|
259
|
+
expect(body.tallyProofs.length).toBeGreaterThan(0);
|
|
260
|
+
expect(body.tallyData).toBeDefined();
|
|
261
|
+
expect(body.tallyData.results).toBeDefined();
|
|
262
|
+
});
|
|
263
|
+
test("should submit results on-chain correctly", async () => {
|
|
264
|
+
const response = await fetch(`${TEST_URL}/proof/submit`, {
|
|
265
|
+
method: "POST",
|
|
266
|
+
headers: {
|
|
267
|
+
Authorization: encryptedHeader,
|
|
268
|
+
"Content-Type": "application/json",
|
|
269
|
+
},
|
|
270
|
+
body: JSON.stringify({
|
|
227
271
|
pollId: Number(pollId),
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
chain: ESupportedNetworks.OPTIMISM_SEPOLIA,
|
|
272
|
+
maciContractAddress: maciAddress,
|
|
273
|
+
chain: CHAIN,
|
|
231
274
|
}),
|
|
232
275
|
});
|
|
233
276
|
expect(response.status).toBe(201);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e2e.deploy.test.js","sourceRoot":"","sources":["../../tests/e2e.deploy.test.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"e2e.deploy.test.js","sourceRoot":"","sources":["../../tests/e2e.deploy.test.ts"],"names":[],"mappings":"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"}
|