@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.
- package/LICENSE +1 -2
- package/README.md +71 -10
- package/build/hardhat.config.cjs +17 -9
- package/build/hardhat.config.cjs.map +1 -1
- package/build/hardhat.config.d.cts +15 -12
- package/build/hardhat.config.d.cts.map +1 -1
- package/build/scripts/generateKeypair.js +2 -2
- package/build/scripts/generateKeypair.js.map +1 -1
- package/build/scripts/generateMaciKeyPair.js +2 -2
- package/build/scripts/generateMaciKeyPair.js.map +1 -1
- package/build/tests/constants.d.ts +3 -4
- package/build/tests/constants.d.ts.map +1 -1
- package/build/tests/constants.js +5 -4
- package/build/tests/constants.js.map +1 -1
- package/build/tests/e2e.deploy.test.js +132 -102
- package/build/tests/e2e.deploy.test.js.map +1 -1
- package/build/tests/e2e.redis.test.d.ts +2 -0
- package/build/tests/e2e.redis.test.d.ts.map +1 -0
- package/build/tests/e2e.redis.test.js +118 -0
- package/build/tests/e2e.redis.test.js.map +1 -0
- package/build/tests/utils.d.ts +7 -1
- package/build/tests/utils.d.ts.map +1 -1
- package/build/tests/utils.js +17 -6
- package/build/tests/utils.js.map +1 -1
- package/build/ts/app.module.d.ts.map +1 -1
- package/build/ts/app.module.js +6 -0
- package/build/ts/app.module.js.map +1 -1
- package/build/ts/common/__tests__/common.test.js +44 -46
- package/build/ts/common/__tests__/common.test.js.map +1 -1
- package/build/ts/common/accountAbstraction.d.ts +7 -24
- package/build/ts/common/accountAbstraction.d.ts.map +1 -1
- package/build/ts/common/accountAbstraction.js +22 -49
- package/build/ts/common/accountAbstraction.js.map +1 -1
- package/build/ts/common/chain.d.ts +22 -0
- package/build/ts/common/chain.d.ts.map +1 -0
- package/build/ts/common/chain.js +37 -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 +13 -10
- package/build/ts/common/errors.d.ts.map +1 -1
- package/build/ts/common/errors.js +12 -9
- package/build/ts/common/errors.js.map +1 -1
- package/build/ts/common/http.d.ts +6 -0
- package/build/ts/common/http.d.ts.map +1 -0
- package/build/ts/common/http.js +49 -0
- package/build/ts/common/http.js.map +1 -0
- package/build/ts/common/index.d.ts +3 -1
- package/build/ts/common/index.d.ts.map +1 -1
- package/build/ts/common/index.js +3 -1
- package/build/ts/common/index.js.map +1 -1
- package/build/ts/common/networks.d.ts +2 -21
- package/build/ts/common/networks.d.ts.map +1 -1
- package/build/ts/common/networks.js +39 -48
- package/build/ts/common/networks.js.map +1 -1
- package/build/ts/common/types.d.ts +3 -4
- package/build/ts/common/types.d.ts.map +1 -1
- package/build/ts/deployer/__tests__/deployer.controller.test.js +23 -25
- package/build/ts/deployer/__tests__/deployer.controller.test.js.map +1 -1
- package/build/ts/deployer/__tests__/deployer.service.test.js +184 -337
- package/build/ts/deployer/__tests__/deployer.service.test.js.map +1 -1
- package/build/ts/deployer/__tests__/utils.d.ts +31 -6
- package/build/ts/deployer/__tests__/utils.d.ts.map +1 -1
- package/build/ts/deployer/__tests__/utils.js +48 -22
- package/build/ts/deployer/__tests__/utils.js.map +1 -1
- package/build/ts/deployer/deployer.controller.d.ts.map +1 -1
- package/build/ts/deployer/deployer.controller.js +19 -6
- package/build/ts/deployer/deployer.controller.js.map +1 -1
- package/build/ts/deployer/deployer.service.d.ts +26 -53
- package/build/ts/deployer/deployer.service.d.ts.map +1 -1
- package/build/ts/deployer/deployer.service.js +345 -454
- package/build/ts/deployer/deployer.service.js.map +1 -1
- package/build/ts/deployer/dto.d.ts +7 -7
- package/build/ts/deployer/dto.d.ts.map +1 -1
- package/build/ts/deployer/dto.js +14 -6
- package/build/ts/deployer/dto.js.map +1 -1
- package/build/ts/deployer/types.d.ts +103 -45
- 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 +16 -10
- 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/health/__tests__/health.controller.test.d.ts +2 -0
- package/build/ts/health/__tests__/health.controller.test.d.ts.map +1 -0
- package/build/ts/health/__tests__/health.controller.test.js +52 -0
- package/build/ts/health/__tests__/health.controller.test.js.map +1 -0
- package/build/ts/health/__tests__/health.service.test.d.ts +2 -0
- package/build/ts/health/__tests__/health.service.test.d.ts.map +1 -0
- package/build/ts/health/__tests__/health.service.test.js +101 -0
- package/build/ts/health/__tests__/health.service.test.js.map +1 -0
- package/build/ts/health/health.controller.d.ts +16 -0
- package/build/ts/health/health.controller.d.ts.map +1 -0
- package/build/ts/health/health.controller.js +43 -0
- package/build/ts/health/health.controller.js.map +1 -0
- package/build/ts/health/health.module.d.ts +3 -0
- package/build/ts/health/health.module.d.ts.map +1 -0
- package/build/ts/health/health.module.js +22 -0
- package/build/ts/health/health.module.js.map +1 -0
- package/build/ts/health/health.service.d.ts +42 -0
- package/build/ts/health/health.service.d.ts.map +1 -0
- package/build/ts/health/health.service.js +176 -0
- package/build/ts/health/health.service.js.map +1 -0
- package/build/ts/health/types.d.ts +87 -0
- package/build/ts/health/types.d.ts.map +1 -0
- package/build/ts/health/types.js +2 -0
- package/build/ts/health/types.js.map +1 -0
- package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts +11 -0
- package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts.map +1 -0
- package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js +12 -0
- package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js.map +1 -0
- package/build/ts/main.js +1 -1
- package/build/ts/proof/__tests__/proof.controller.test.js +8 -7
- package/build/ts/proof/__tests__/proof.controller.test.js.map +1 -1
- package/build/ts/proof/__tests__/proof.gateway.test.js +5 -3
- package/build/ts/proof/__tests__/proof.gateway.test.js.map +1 -1
- package/build/ts/proof/__tests__/proof.service.test.js +31 -75
- package/build/ts/proof/__tests__/proof.service.test.js.map +1 -1
- package/build/ts/proof/dto.d.ts +15 -18
- package/build/ts/proof/dto.d.ts.map +1 -1
- package/build/ts/proof/dto.js +55 -49
- 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 +38 -15
- package/build/ts/proof/proof.controller.js.map +1 -1
- package/build/ts/proof/proof.module.d.ts.map +1 -1
- package/build/ts/proof/proof.module.js +1 -0
- package/build/ts/proof/proof.module.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 +21 -17
- package/build/ts/proof/types.d.ts.map +1 -1
- package/build/ts/proof/types.js.map +1 -1
- package/build/ts/redis/__tests__/redis.service.test.d.ts +2 -0
- package/build/ts/redis/__tests__/redis.service.test.d.ts.map +1 -0
- package/build/ts/redis/__tests__/redis.service.test.js +148 -0
- package/build/ts/redis/__tests__/redis.service.test.js.map +1 -0
- package/build/ts/redis/redis.module.d.ts +3 -0
- package/build/ts/redis/redis.module.d.ts.map +1 -0
- package/build/ts/redis/redis.module.js +18 -0
- package/build/ts/redis/redis.module.js.map +1 -0
- package/build/ts/redis/redis.service.d.ts +53 -0
- package/build/ts/redis/redis.service.d.ts.map +1 -0
- package/build/ts/redis/redis.service.js +99 -0
- package/build/ts/redis/redis.service.js.map +1 -0
- package/build/ts/redis/types.d.ts +66 -0
- package/build/ts/redis/types.d.ts.map +1 -0
- package/build/ts/redis/types.js +2 -0
- package/build/ts/redis/types.js.map +1 -0
- package/build/ts/redis/utils.d.ts +20 -0
- package/build/ts/redis/utils.d.ts.map +1 -0
- package/build/ts/redis/utils.js +27 -0
- package/build/ts/redis/utils.js.map +1 -0
- package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts +2 -0
- package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts.map +1 -0
- package/build/ts/scheduler/__tests__/scheduler.controller.test.js +62 -0
- package/build/ts/scheduler/__tests__/scheduler.controller.test.js.map +1 -0
- package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts +2 -0
- package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts.map +1 -0
- package/build/ts/scheduler/__tests__/scheduler.service.test.js +369 -0
- package/build/ts/scheduler/__tests__/scheduler.service.test.js.map +1 -0
- package/build/ts/scheduler/dto.d.ts +41 -0
- package/build/ts/scheduler/dto.d.ts.map +1 -0
- package/build/ts/scheduler/dto.js +115 -0
- package/build/ts/scheduler/dto.js.map +1 -0
- package/build/ts/scheduler/scheduler.controller.d.ts +32 -0
- package/build/ts/scheduler/scheduler.controller.d.ts.map +1 -0
- package/build/ts/scheduler/scheduler.controller.js +118 -0
- package/build/ts/scheduler/scheduler.controller.js.map +1 -0
- package/build/ts/scheduler/scheduler.module.d.ts +3 -0
- package/build/ts/scheduler/scheduler.module.d.ts.map +1 -0
- package/build/ts/scheduler/scheduler.module.js +24 -0
- package/build/ts/scheduler/scheduler.module.js.map +1 -0
- package/build/ts/scheduler/scheduler.service.d.ts +71 -0
- package/build/ts/scheduler/scheduler.service.d.ts.map +1 -0
- package/build/ts/scheduler/scheduler.service.js +297 -0
- package/build/ts/scheduler/scheduler.service.js.map +1 -0
- package/build/ts/scheduler/types.d.ts +65 -0
- package/build/ts/scheduler/types.d.ts.map +1 -0
- package/build/ts/scheduler/types.js +2 -0
- package/build/ts/scheduler/types.js.map +1 -0
- package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js +2 -2
- package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js.map +1 -1
- package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js +34 -19
- package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js.map +1 -1
- package/build/ts/sessionKeys/__tests__/utils.d.ts +1 -1
- package/build/ts/sessionKeys/__tests__/utils.d.ts.map +1 -1
- package/build/ts/sessionKeys/__tests__/utils.js +7 -6
- package/build/ts/sessionKeys/__tests__/utils.js.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 +16 -4
- package/build/ts/sessionKeys/sessionKeys.service.d.ts.map +1 -1
- package/build/ts/sessionKeys/sessionKeys.service.js +23 -6
- package/build/ts/sessionKeys/sessionKeys.service.js.map +1 -1
- package/build/ts/subgraph/__tests__/subgraph.controller.test.js +3 -3
- package/build/ts/subgraph/__tests__/subgraph.controller.test.js.map +1 -1
- package/build/ts/subgraph/__tests__/subgraph.gateway.test.js +2 -2
- package/build/ts/subgraph/__tests__/subgraph.gateway.test.js.map +1 -1
- package/build/ts/subgraph/__tests__/subgraph.service.test.js +5 -5
- package/build/ts/subgraph/__tests__/subgraph.service.test.js.map +1 -1
- package/build/ts/subgraph/dto.d.ts +2 -2
- package/build/ts/subgraph/dto.d.ts.map +1 -1
- package/build/ts/subgraph/dto.js +3 -3
- package/build/ts/subgraph/dto.js.map +1 -1
- package/build/ts/subgraph/subgraph.controller.d.ts.map +1 -1
- package/build/ts/subgraph/subgraph.controller.js +8 -3
- package/build/ts/subgraph/subgraph.controller.js.map +1 -1
- package/build/ts/subgraph/subgraph.service.d.ts +4 -0
- package/build/ts/subgraph/subgraph.service.d.ts.map +1 -1
- package/build/ts/subgraph/subgraph.service.js +23 -10
- package/build/ts/subgraph/subgraph.service.js.map +1 -1
- package/build/ts/subgraph/types.d.ts +2 -2
- package/build/ts/subgraph/types.d.ts.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +46 -39
- package/build/tests/e2e.aa.test.d.ts +0 -2
- package/build/tests/e2e.aa.test.d.ts.map +0 -1
- package/build/tests/e2e.aa.test.js +0 -103
- package/build/tests/e2e.aa.test.js.map +0 -1
- 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
|
@@ -7,29 +7,19 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
import { ConstantInitialVoiceCreditProxy__factory as ConstantInitialVoiceCreditProxyFactory, ContractStorage, EPolicies, FreeForAllPolicy__factory as FreeForAllPolicyFactory, EASPolicy__factory as EASPolicyFactory, ZupassPolicy__factory as ZupassPolicyFactory, HatsPolicy__factory as HatsPolicyFactory, SemaphorePolicy__factory as SemaphorePolicyFactory, GitcoinPassportPolicy__factory as GitcoinPassportPolicyFactory, Verifier__factory as VerifierFactory, PoseidonT3__factory as PoseidonT3Factory, PoseidonT4__factory as PoseidonT4Factory, PoseidonT5__factory as PoseidonT5Factory, PoseidonT6__factory as PoseidonT6Factory, VkRegistry__factory as VkRegistryFactory, TallyFactory__factory as TallyFactoryFactory, PollFactory__factory as PollFactoryFactory, MessageProcessorFactory__factory as MessageProcessorFactoryFactory, MessageProcessor__factory as MessageProcessorFactory, ERC20VotesPolicy__factory as ERC20VotesPolicyFactory, Tally__factory as TallyFactory, Poll__factory as PollFactory, MACI__factory as MACIFactory, EContracts, EInitialVoiceCreditProxies, EMode, deployPoll, extractAllVks, extractVk, genEmptyBallotRoots, } from "@maci-protocol/sdk";
|
|
13
|
-
import { Injectable, Logger } from "@nestjs/common";
|
|
10
|
+
import { ContractStorage, EPolicies, VerifyingKeysRegistry__factory as VerifyingKeysRegistryFactory, Verifier__factory as VerifierFactory, MessageProcessor__factory as MessageProcessorFactory, Tally__factory as TallyFactory, Poll__factory as PollFactory, MACI__factory as MACIFactory, EContracts, EInitialVoiceCreditProxies, EMode, deployPoll, extractAllVerifyingKeys, deployConstantInitialVoiceCreditProxy, deployFreeForAllSignUpPolicy, deployERC20VotesPolicy, deployAnonAadhaarPolicy, deploySignupTokenPolicy, deployMerkleProofPolicy, deploySemaphoreSignupPolicy, deployZupassSignUpPolicy, deployGitcoinPassportPolicy, deployEASSignUpPolicy, deployHatsSignupPolicy, deployMaci, setVerifyingKeys, generateEmptyBallotRoots, getDeployedPolicyProxyFactories, ECheckerFactories, EPolicyFactories, deployConstantInitialVoiceCreditProxyFactory, EInitialVoiceCreditProxiesFactories, } from "@maci-protocol/sdk";
|
|
11
|
+
import { Injectable } from "@nestjs/common";
|
|
14
12
|
import { BaseContract } from "ethers";
|
|
15
|
-
import { encodeFunctionData } from "viem";
|
|
16
|
-
import path from "path";
|
|
17
13
|
import { ErrorCodes } from "../common";
|
|
18
|
-
import {
|
|
14
|
+
import { getCoordinatorKeypair } from "../common/coordinatorKeypair";
|
|
19
15
|
import { FileService } from "../file/file.service";
|
|
20
16
|
import { SessionKeysService } from "../sessionKeys/sessionKeys.service";
|
|
21
|
-
import { MAX_GAS_LIMIT } from "./constants";
|
|
22
|
-
import { estimateExtraGasLimit } from "./utils";
|
|
23
17
|
/**
|
|
24
18
|
* DeployerService is responsible for deploying contracts.
|
|
25
19
|
*/
|
|
26
|
-
let DeployerService =
|
|
20
|
+
let DeployerService = class DeployerService {
|
|
27
21
|
sessionKeysService;
|
|
28
22
|
fileService;
|
|
29
|
-
/**
|
|
30
|
-
* Logger
|
|
31
|
-
*/
|
|
32
|
-
logger = new Logger(DeployerService_1.name);
|
|
33
23
|
/**
|
|
34
24
|
* Contract storage instance
|
|
35
25
|
*/
|
|
@@ -42,299 +32,334 @@ let DeployerService = DeployerService_1 = class DeployerService {
|
|
|
42
32
|
constructor(sessionKeysService, fileService) {
|
|
43
33
|
this.sessionKeysService = sessionKeysService;
|
|
44
34
|
this.fileService = fileService;
|
|
45
|
-
this.
|
|
46
|
-
this.storage = ContractStorage.getInstance(path.join(process.cwd(), "deployed-contracts.json"));
|
|
35
|
+
this.storage = ContractStorage.getInstance();
|
|
47
36
|
}
|
|
48
37
|
/**
|
|
49
|
-
* Get the policy
|
|
50
|
-
*
|
|
38
|
+
* Get the policy contract object
|
|
39
|
+
* always deploy and save it
|
|
51
40
|
*
|
|
52
|
-
* @param
|
|
41
|
+
* @param signer - the signer
|
|
53
42
|
* @param network - the network
|
|
54
|
-
* @param
|
|
55
|
-
* @returns - the policy
|
|
43
|
+
* @param policyConfig - the policy configuration parameters
|
|
44
|
+
* @returns - the policy contract
|
|
56
45
|
*/
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
let
|
|
60
|
-
let
|
|
46
|
+
async deployAndSavePolicy(signer, network, policyConfig) {
|
|
47
|
+
let policyContract;
|
|
48
|
+
let checkerContract;
|
|
49
|
+
let policyFactory;
|
|
50
|
+
let checkFactory;
|
|
51
|
+
let policyFactoryName;
|
|
52
|
+
let checkFactoryName;
|
|
53
|
+
let factoryIsSaved;
|
|
54
|
+
let checkerIsSaved;
|
|
55
|
+
const { policyType, checkerType, args } = policyConfig;
|
|
61
56
|
// based on the policy type, we need to deploy the correct policy
|
|
62
57
|
switch (policyType) {
|
|
63
58
|
case EPolicies.FreeForAll: {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
59
|
+
policyFactoryName = EPolicyFactories.FreeForAll;
|
|
60
|
+
checkFactoryName = ECheckerFactories.FreeForAll;
|
|
61
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
62
|
+
policy: policyFactoryName,
|
|
63
|
+
checker: checkFactoryName,
|
|
64
|
+
network,
|
|
65
|
+
signer,
|
|
66
|
+
});
|
|
67
|
+
factoryIsSaved = !!factories.policy;
|
|
68
|
+
checkerIsSaved = !!factories.checker;
|
|
69
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployFreeForAllSignUpPolicy(factories, signer, true);
|
|
70
|
+
break;
|
|
70
71
|
}
|
|
71
72
|
case EPolicies.EAS: {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
73
|
+
policyFactoryName = EPolicyFactories.EAS;
|
|
74
|
+
checkFactoryName = ECheckerFactories.EAS;
|
|
75
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
76
|
+
policy: policyFactoryName,
|
|
77
|
+
checker: checkFactoryName,
|
|
78
|
+
network,
|
|
79
|
+
signer,
|
|
80
|
+
});
|
|
81
|
+
factoryIsSaved = !!factories.policy;
|
|
82
|
+
checkerIsSaved = !!factories.checker;
|
|
83
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployEASSignUpPolicy({
|
|
84
|
+
eas: args.easAddress,
|
|
85
|
+
attester: args.attester,
|
|
86
|
+
schema: args.schema,
|
|
87
|
+
}, factories, signer, true);
|
|
88
|
+
break;
|
|
85
89
|
}
|
|
86
|
-
case EPolicies.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
};
|
|
90
|
+
case EPolicies.GitcoinPassport: {
|
|
91
|
+
policyFactoryName = EPolicyFactories.GitcoinPassport;
|
|
92
|
+
checkFactoryName = ECheckerFactories.GitcoinPassport;
|
|
93
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
94
|
+
policy: policyFactoryName,
|
|
95
|
+
checker: checkFactoryName,
|
|
96
|
+
network,
|
|
97
|
+
signer,
|
|
98
|
+
});
|
|
99
|
+
factoryIsSaved = !!factories.policy;
|
|
100
|
+
checkerIsSaved = !!factories.checker;
|
|
101
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployGitcoinPassportPolicy({
|
|
102
|
+
decoderAddress: args.decoderAddress,
|
|
103
|
+
minimumScore: Number(args.passingScore),
|
|
104
|
+
}, factories, signer, true);
|
|
105
|
+
break;
|
|
101
106
|
}
|
|
102
107
|
case EPolicies.Hats: {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
policyFactoryName = EPolicyFactories.Hats;
|
|
109
|
+
checkFactoryName = ECheckerFactories.Hats;
|
|
110
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
111
|
+
policy: policyFactoryName,
|
|
112
|
+
checker: checkFactoryName,
|
|
113
|
+
network,
|
|
114
|
+
signer,
|
|
115
|
+
});
|
|
116
|
+
factoryIsSaved = !!factories.policy;
|
|
117
|
+
checkerIsSaved = !!factories.checker;
|
|
118
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployHatsSignupPolicy({
|
|
119
|
+
hats: args.hatsProtocolAddress,
|
|
120
|
+
criterionHats: args.critrionHats.map((c) => BigInt(c)),
|
|
121
|
+
}, factories, signer, true);
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case EPolicies.Zupass: {
|
|
125
|
+
policyFactoryName = EPolicyFactories.Zupass;
|
|
126
|
+
checkFactoryName = ECheckerFactories.Zupass;
|
|
127
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
128
|
+
policy: policyFactoryName,
|
|
129
|
+
checker: checkFactoryName,
|
|
130
|
+
network,
|
|
131
|
+
signer,
|
|
132
|
+
});
|
|
133
|
+
factoryIsSaved = !!factories.policy;
|
|
134
|
+
checkerIsSaved = !!factories.checker;
|
|
135
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployZupassSignUpPolicy({
|
|
136
|
+
eventId: args.eventId,
|
|
137
|
+
signer1: args.signer1,
|
|
138
|
+
signer2: args.signer2,
|
|
139
|
+
verifier: args.zupassVerifier,
|
|
140
|
+
}, factories, signer, true);
|
|
141
|
+
break;
|
|
115
142
|
}
|
|
116
143
|
case EPolicies.Semaphore: {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
144
|
+
policyFactoryName = EPolicyFactories.Semaphore;
|
|
145
|
+
checkFactoryName = ECheckerFactories.Semaphore;
|
|
146
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
147
|
+
policy: policyFactoryName,
|
|
148
|
+
checker: checkFactoryName,
|
|
149
|
+
network,
|
|
150
|
+
signer,
|
|
151
|
+
});
|
|
152
|
+
factoryIsSaved = !!factories.policy;
|
|
153
|
+
checkerIsSaved = !!factories.checker;
|
|
154
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deploySemaphoreSignupPolicy({
|
|
155
|
+
semaphore: args.semaphoreContract,
|
|
156
|
+
groupId: BigInt(args.groupId),
|
|
157
|
+
}, factories, signer, true);
|
|
158
|
+
break;
|
|
129
159
|
}
|
|
130
|
-
case EPolicies.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
160
|
+
case EPolicies.MerkleProof: {
|
|
161
|
+
policyFactoryName = EPolicyFactories.MerkleProof;
|
|
162
|
+
checkFactoryName = ECheckerFactories.MerkleProof;
|
|
163
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
164
|
+
policy: policyFactoryName,
|
|
165
|
+
checker: checkFactoryName,
|
|
166
|
+
network,
|
|
167
|
+
signer,
|
|
168
|
+
});
|
|
169
|
+
factoryIsSaved = !!factories.policy;
|
|
170
|
+
checkerIsSaved = !!factories.checker;
|
|
171
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployMerkleProofPolicy({
|
|
172
|
+
root: args.root,
|
|
173
|
+
}, factories, signer, true);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case EPolicies.Token: {
|
|
177
|
+
policyFactoryName = EPolicyFactories.Token;
|
|
178
|
+
checkFactoryName = ECheckerFactories.Token;
|
|
179
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
180
|
+
policy: policyFactoryName,
|
|
181
|
+
checker: checkFactoryName,
|
|
182
|
+
network,
|
|
183
|
+
signer,
|
|
184
|
+
});
|
|
185
|
+
factoryIsSaved = !!factories.policy;
|
|
186
|
+
checkerIsSaved = !!factories.checker;
|
|
187
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deploySignupTokenPolicy({
|
|
188
|
+
token: args.token,
|
|
189
|
+
}, factories, signer, true);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case EPolicies.AnonAadhaar: {
|
|
193
|
+
policyFactoryName = EPolicyFactories.AnonAadhaar;
|
|
194
|
+
checkFactoryName = ECheckerFactories.AnonAadhaar;
|
|
195
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
196
|
+
policy: policyFactoryName,
|
|
197
|
+
checker: checkFactoryName,
|
|
198
|
+
network,
|
|
199
|
+
signer,
|
|
200
|
+
});
|
|
201
|
+
factoryIsSaved = !!factories.policy;
|
|
202
|
+
checkerIsSaved = !!factories.checker;
|
|
203
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployAnonAadhaarPolicy({
|
|
204
|
+
verifierAddress: args.verifier,
|
|
205
|
+
nullifierSeed: args.nullifierSeed,
|
|
206
|
+
}, factories, signer, true);
|
|
207
|
+
break;
|
|
143
208
|
}
|
|
144
209
|
case EPolicies.ERC20Votes: {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
210
|
+
policyFactoryName = EPolicyFactories.ERC20Votes;
|
|
211
|
+
checkFactoryName = ECheckerFactories.ERC20Votes;
|
|
212
|
+
const factories = await getDeployedPolicyProxyFactories({
|
|
213
|
+
policy: policyFactoryName,
|
|
214
|
+
checker: checkFactoryName,
|
|
215
|
+
network,
|
|
216
|
+
signer,
|
|
217
|
+
});
|
|
218
|
+
factoryIsSaved = !!factories.policy;
|
|
219
|
+
checkerIsSaved = !!factories.checker;
|
|
220
|
+
[policyContract, checkerContract, policyFactory, checkFactory] = await deployERC20VotesPolicy({
|
|
221
|
+
snapshotBlock: BigInt(args.snapshotBlock),
|
|
222
|
+
threshold: BigInt(args.threshold),
|
|
223
|
+
token: args.token,
|
|
224
|
+
}, factories, signer, true);
|
|
225
|
+
break;
|
|
158
226
|
}
|
|
159
227
|
default:
|
|
160
228
|
throw new Error(ErrorCodes.UNSUPPORTED_POLICY.toString());
|
|
161
229
|
}
|
|
230
|
+
await this.storage.register({
|
|
231
|
+
id: policyType,
|
|
232
|
+
name: policyType,
|
|
233
|
+
contract: policyContract,
|
|
234
|
+
args: [await checkerContract.getAddress()],
|
|
235
|
+
network,
|
|
236
|
+
});
|
|
237
|
+
await this.storage.register({
|
|
238
|
+
id: checkerType,
|
|
239
|
+
name: checkerType,
|
|
240
|
+
contract: checkerContract,
|
|
241
|
+
args: args ? Object.values(args).map((arg) => String(arg)) : [],
|
|
242
|
+
network,
|
|
243
|
+
});
|
|
244
|
+
if (!factoryIsSaved) {
|
|
245
|
+
await this.storage.register({
|
|
246
|
+
id: policyFactoryName,
|
|
247
|
+
name: policyFactoryName,
|
|
248
|
+
contract: policyFactory,
|
|
249
|
+
network,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
if (!checkerIsSaved) {
|
|
253
|
+
await this.storage.register({
|
|
254
|
+
id: checkFactoryName,
|
|
255
|
+
name: checkFactoryName,
|
|
256
|
+
contract: checkFactory,
|
|
257
|
+
network,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return policyContract;
|
|
162
261
|
}
|
|
163
262
|
/**
|
|
164
|
-
* Get the voice credit proxy
|
|
165
|
-
*
|
|
263
|
+
* Get the voice credit proxy factory contract object
|
|
264
|
+
* always deploy and save it
|
|
166
265
|
*
|
|
167
|
-
* @param
|
|
266
|
+
* @param signer - the signer
|
|
267
|
+
* @param voiceCreditProxyFactoryType - the voice credit proxy factory type
|
|
168
268
|
* @param network - the network
|
|
169
|
-
* @
|
|
170
|
-
* @returns - the voice credit proxy abi and bytecode
|
|
269
|
+
* @returns - the voice credit proxy factory contract
|
|
171
270
|
*/
|
|
172
|
-
|
|
173
|
-
let
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
storedArgs = this.storage.getContractArgs(voiceCreditProxyType, network);
|
|
179
|
-
isAlreadyDeployed = !!storedArgs && storedArgs[0] === args.amount;
|
|
180
|
-
return {
|
|
181
|
-
address: isAlreadyDeployed ? address : undefined,
|
|
182
|
-
abi: ConstantInitialVoiceCreditProxyFactory.abi,
|
|
183
|
-
bytecode: ConstantInitialVoiceCreditProxyFactory.bytecode,
|
|
184
|
-
alreadyDeployed: isAlreadyDeployed,
|
|
185
|
-
};
|
|
271
|
+
async deployAndSaveVoiceCreditProxyFactory(signer, voiceCreditProxyFactoryType, network) {
|
|
272
|
+
let contract;
|
|
273
|
+
switch (voiceCreditProxyFactoryType) {
|
|
274
|
+
case EInitialVoiceCreditProxiesFactories.Constant: {
|
|
275
|
+
contract = await deployConstantInitialVoiceCreditProxyFactory(signer, true);
|
|
276
|
+
break;
|
|
186
277
|
}
|
|
187
278
|
default:
|
|
188
|
-
throw new Error(ErrorCodes.
|
|
279
|
+
throw new Error(ErrorCodes.UNSUPPORTED_VOICE_CREDIT_PROXY_FACTORY.toString());
|
|
189
280
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
* @param publicClient - the public client
|
|
196
|
-
* @returns - the address
|
|
197
|
-
*/
|
|
198
|
-
async deployAndGetAddress(kernelClient, abi, bytecode, args, bundlerClient, publicClient) {
|
|
199
|
-
const deployCallData = await kernelClient.account.encodeDeployCallData({
|
|
200
|
-
abi,
|
|
201
|
-
args,
|
|
202
|
-
bytecode,
|
|
203
|
-
});
|
|
204
|
-
const gasPrice = await kernelClient.getUserOperationGasPrice();
|
|
205
|
-
const opEstimate = await kernelClient.prepareUserOperation({
|
|
206
|
-
callData: deployCallData,
|
|
207
|
-
sender: kernelClient.account.address,
|
|
208
|
-
maxFeePerGas: gasPrice.maxFeePerGas,
|
|
209
|
-
maxPriorityFeePerGas: gasPrice.maxPriorityFeePerGas,
|
|
210
|
-
});
|
|
211
|
-
const callGasLimitMultiplier = estimateExtraGasLimit(opEstimate.callGasLimit);
|
|
212
|
-
const tx = await kernelClient.sendUserOperation({
|
|
213
|
-
callData: deployCallData,
|
|
214
|
-
sender: kernelClient.account.address,
|
|
215
|
-
maxFeePerGas: gasPrice.maxFeePerGas,
|
|
216
|
-
maxPriorityFeePerGas: gasPrice.maxPriorityFeePerGas,
|
|
217
|
-
callGasLimit: opEstimate.callGasLimit + callGasLimitMultiplier < MAX_GAS_LIMIT
|
|
218
|
-
? opEstimate.callGasLimit + callGasLimitMultiplier
|
|
219
|
-
: MAX_GAS_LIMIT,
|
|
281
|
+
this.storage.register({
|
|
282
|
+
id: voiceCreditProxyFactoryType,
|
|
283
|
+
contract,
|
|
284
|
+
args: [],
|
|
285
|
+
network,
|
|
220
286
|
});
|
|
221
|
-
|
|
222
|
-
hash: tx,
|
|
223
|
-
});
|
|
224
|
-
const txReceipt = await publicClient.getTransactionReceipt({
|
|
225
|
-
hash: receipt.receipt.transactionHash,
|
|
226
|
-
});
|
|
227
|
-
return getDeployedContractAddress(txReceipt);
|
|
287
|
+
return contract;
|
|
228
288
|
}
|
|
229
289
|
/**
|
|
230
|
-
*
|
|
290
|
+
* Get the voice credit proxy contract object
|
|
291
|
+
* always deploy and save it
|
|
231
292
|
*
|
|
232
|
-
* @param
|
|
293
|
+
* @param signer - the signer
|
|
294
|
+
* @param voiceCreditProxyType - the voice credit proxy type
|
|
295
|
+
* @param network - the network
|
|
296
|
+
* @param initialVoiceCreditProxyFactory - the initial voice credit proxy factory
|
|
233
297
|
* @param args - the args
|
|
234
|
-
* @
|
|
235
|
-
* @param bytecode - the bytecode
|
|
236
|
-
* @param kernelClient - the kernel client
|
|
237
|
-
* @param publicClient - the public client
|
|
238
|
-
* @param chain - the chain
|
|
239
|
-
* @returns - the address of the deployed contract
|
|
298
|
+
* @returns - the voice credit proxy contract
|
|
240
299
|
*/
|
|
241
|
-
async
|
|
242
|
-
let
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
300
|
+
async deployAndSaveVoiceCreditProxy(signer, voiceCreditProxyType, network, initialVoiceCreditProxyFactory, args) {
|
|
301
|
+
let contract;
|
|
302
|
+
switch (voiceCreditProxyType) {
|
|
303
|
+
case EInitialVoiceCreditProxies.Constant: {
|
|
304
|
+
contract = await deployConstantInitialVoiceCreditProxy({
|
|
305
|
+
amount: args.amount,
|
|
306
|
+
}, initialVoiceCreditProxyFactory, signer);
|
|
307
|
+
break;
|
|
248
308
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
contract: new BaseContract(address, abi),
|
|
252
|
-
args: args.map((arg) => {
|
|
253
|
-
if (Array.isArray(arg)) {
|
|
254
|
-
return arg.map((a) => String(a));
|
|
255
|
-
}
|
|
256
|
-
return String(arg);
|
|
257
|
-
}),
|
|
258
|
-
network: chain,
|
|
259
|
-
});
|
|
309
|
+
default:
|
|
310
|
+
throw new Error(ErrorCodes.UNSUPPORTED_VOICE_CREDIT_PROXY.toString());
|
|
260
311
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
* @param value - the value of the user operation
|
|
267
|
-
* @param abi - the abi
|
|
268
|
-
* @param functionName - the function name
|
|
269
|
-
* @param args - the args
|
|
270
|
-
* @param errorMessage - the error message
|
|
271
|
-
* @param kernelClient - the kernel client
|
|
272
|
-
* @param bundlerClient - the bundler client
|
|
273
|
-
*/
|
|
274
|
-
async estimateGasAndSend(to, value, abi, functionName, args, errorMessage, kernelClient, bundlerClient) {
|
|
275
|
-
const gasEstimates = await kernelClient.getUserOperationGasPrice();
|
|
276
|
-
const userOperation = {
|
|
277
|
-
sender: kernelClient.account.address,
|
|
278
|
-
maxFeePerGas: gasEstimates.maxFeePerGas,
|
|
279
|
-
maxPriorityFeePerGas: gasEstimates.maxPriorityFeePerGas,
|
|
280
|
-
callData: await kernelClient.account.encodeCalls([
|
|
281
|
-
{
|
|
282
|
-
to,
|
|
283
|
-
value,
|
|
284
|
-
data: encodeFunctionData({
|
|
285
|
-
abi,
|
|
286
|
-
functionName,
|
|
287
|
-
args,
|
|
288
|
-
}),
|
|
289
|
-
},
|
|
290
|
-
]),
|
|
291
|
-
};
|
|
292
|
-
const opEstimate = await kernelClient.prepareUserOperation(userOperation);
|
|
293
|
-
const callGasLimitMultiplier = estimateExtraGasLimit(opEstimate.callGasLimit);
|
|
294
|
-
const userOperationHash = await kernelClient.sendUserOperation({
|
|
295
|
-
...userOperation,
|
|
296
|
-
callGasLimit: opEstimate.callGasLimit + callGasLimitMultiplier < MAX_GAS_LIMIT
|
|
297
|
-
? opEstimate.callGasLimit + callGasLimitMultiplier
|
|
298
|
-
: MAX_GAS_LIMIT,
|
|
312
|
+
await this.storage.register({
|
|
313
|
+
id: voiceCreditProxyType,
|
|
314
|
+
contract,
|
|
315
|
+
args: args ? Object.values(args).map((arg) => String(arg)) : [],
|
|
316
|
+
network,
|
|
299
317
|
});
|
|
300
|
-
|
|
301
|
-
if (!receipt.success) {
|
|
302
|
-
throw new Error(errorMessage);
|
|
303
|
-
}
|
|
304
|
-
return receipt;
|
|
318
|
+
return contract;
|
|
305
319
|
}
|
|
306
320
|
/**
|
|
307
321
|
* Get verifying keys arguments (specially zkey paths)
|
|
308
322
|
* @param signer - the signer
|
|
309
|
-
* @param
|
|
310
|
-
* @param
|
|
323
|
+
* @param verifyingKeysRegistryContract - the deployed verifyingKey registry contract
|
|
324
|
+
* @param verifyingKeysRegistryArgs - the arguments send to the endpoint
|
|
311
325
|
* @param mode - use QV or NON_QV
|
|
312
326
|
* @returns SetVerifyingKeysArgs
|
|
313
327
|
*/
|
|
314
|
-
async getVerifyingKeysArgs(signer,
|
|
315
|
-
const pollJoiningZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINING_ZKEY_NAME
|
|
316
|
-
const pollJoinedZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINED_ZKEY_NAME
|
|
317
|
-
const
|
|
318
|
-
const tallyVotesZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_TALLY_ZKEY_NAME, mode === EMode.QV).zkey;
|
|
319
|
-
const { pollJoiningVk, pollJoinedVk, processVk, tallyVk } = await extractAllVks({
|
|
328
|
+
async getVerifyingKeysArgs(signer, verifyingKeysRegistryAddress, verifyingKeysRegistryArgs, modes) {
|
|
329
|
+
const { zkey: pollJoiningZkeyPath } = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINING_ZKEY_NAME);
|
|
330
|
+
const { zkey: pollJoinedZkeyPath } = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINED_ZKEY_NAME);
|
|
331
|
+
const { pollJoiningVerifyingKey, pollJoinedVerifyingKey } = await extractAllVerifyingKeys({
|
|
320
332
|
pollJoiningZkeyPath,
|
|
321
333
|
pollJoinedZkeyPath,
|
|
322
|
-
processMessagesZkeyPath,
|
|
323
|
-
tallyVotesZkeyPath,
|
|
324
334
|
});
|
|
325
|
-
const
|
|
335
|
+
const processAndTallyVerifyingKeys = await Promise.all(modes.map(async (mode) => {
|
|
336
|
+
const { zkey: messageProcessorZkeyPath } = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_MESSAGE_PROCESS_ZKEY_NAME, mode);
|
|
337
|
+
// There are only QV and Non-QV modes available for tally circuit
|
|
338
|
+
const { zkey: voteTallyZkeyPath } = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_TALLY_ZKEY_NAME,
|
|
339
|
+
// if FULL use NON_QV because there are only VoteTallyQV and VoteTallyNonQV zkeys
|
|
340
|
+
mode === EMode.FULL ? EMode.NON_QV : mode);
|
|
341
|
+
const { processVerifyingKey, tallyVerifyingKey } = await extractAllVerifyingKeys({
|
|
342
|
+
messageProcessorZkeyPath,
|
|
343
|
+
voteTallyZkeyPath,
|
|
344
|
+
});
|
|
345
|
+
return { processVerifyingKey: processVerifyingKey, tallyVerifyingKey: tallyVerifyingKey };
|
|
346
|
+
}));
|
|
347
|
+
const processVerifyingKeys = processAndTallyVerifyingKeys.map((item) => item.processVerifyingKey);
|
|
348
|
+
const tallyVerifyingKeys = processAndTallyVerifyingKeys.map((item) => item.tallyVerifyingKey);
|
|
349
|
+
const { stateTreeDepth, pollStateTreeDepth, tallyProcessingStateTreeDepth, voteOptionTreeDepth, messageBatchSize } = verifyingKeysRegistryArgs;
|
|
326
350
|
return {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
351
|
+
pollJoiningVerifyingKey: pollJoiningVerifyingKey,
|
|
352
|
+
pollJoinedVerifyingKey: pollJoinedVerifyingKey,
|
|
353
|
+
processMessagesVerifyingKeys: processVerifyingKeys,
|
|
354
|
+
tallyVotesVerifyingKeys: tallyVerifyingKeys,
|
|
331
355
|
stateTreeDepth: Number(stateTreeDepth),
|
|
332
|
-
|
|
356
|
+
tallyProcessingStateTreeDepth: Number(tallyProcessingStateTreeDepth),
|
|
333
357
|
voteOptionTreeDepth: Number(voteOptionTreeDepth),
|
|
334
358
|
messageBatchSize: Number(messageBatchSize),
|
|
359
|
+
pollStateTreeDepth: Number(pollStateTreeDepth),
|
|
335
360
|
signer,
|
|
336
|
-
|
|
337
|
-
|
|
361
|
+
modes,
|
|
362
|
+
verifyingKeysRegistryAddress,
|
|
338
363
|
};
|
|
339
364
|
}
|
|
340
365
|
/**
|
|
@@ -346,161 +371,47 @@ let DeployerService = DeployerService_1 = class DeployerService {
|
|
|
346
371
|
* @returns the address of the deployed maci contract
|
|
347
372
|
*/
|
|
348
373
|
async deployMaci({ approval, sessionKeyAddress, chain, config }) {
|
|
349
|
-
const
|
|
350
|
-
const
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
const
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
//
|
|
360
|
-
|
|
361
|
-
await this.
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
"contracts/crypto/PoseidonT5.sol:PoseidonT5": poseidonT5Address,
|
|
391
|
-
"contracts/crypto/PoseidonT6.sol:PoseidonT6": poseidonT6Address,
|
|
392
|
-
}), kernelClient, bundlerClient, publicClient, chain);
|
|
393
|
-
const messageProcessorFactoryAddress = await this.deployAndStore(EContracts.MessageProcessorFactory, [], MessageProcessorFactoryFactory.abi, MessageProcessorFactoryFactory.linkBytecode({
|
|
394
|
-
"contracts/crypto/PoseidonT3.sol:PoseidonT3": poseidonT3Address,
|
|
395
|
-
"contracts/crypto/PoseidonT4.sol:PoseidonT4": poseidonT4Address,
|
|
396
|
-
"contracts/crypto/PoseidonT5.sol:PoseidonT5": poseidonT5Address,
|
|
397
|
-
"contracts/crypto/PoseidonT6.sol:PoseidonT6": poseidonT6Address,
|
|
398
|
-
}), kernelClient, bundlerClient, publicClient, chain);
|
|
399
|
-
// 4. VkRegistry
|
|
400
|
-
const vkRegistryAddress = await this.deployAndStore(EContracts.VkRegistry, [], VkRegistryFactory.abi, VkRegistryFactory.bytecode, kernelClient, bundlerClient, publicClient, chain);
|
|
401
|
-
try {
|
|
402
|
-
const processMessagesZkeyPathQv = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_MESSAGE_PROCESS_ZKEY_NAME, true);
|
|
403
|
-
const tallyVotesZkeyPathQv = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_TALLY_ZKEY_NAME, true);
|
|
404
|
-
const processMessagesZkeyPathNonQv = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_MESSAGE_PROCESS_ZKEY_NAME, false);
|
|
405
|
-
const tallyVotesZkeyPathNonQv = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_TALLY_ZKEY_NAME, false);
|
|
406
|
-
const pollJoiningZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINING_ZKEY_NAME, true);
|
|
407
|
-
const pollJoinedZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINED_ZKEY_NAME, true);
|
|
408
|
-
const [qvProcessVk, qvTallyVk, nonQvProcessVk, nonQvTallyVk, pollJoiningVk, pollJoinedVk] = await Promise.all([
|
|
409
|
-
extractVk(processMessagesZkeyPathQv.zkey),
|
|
410
|
-
extractVk(tallyVotesZkeyPathQv.zkey),
|
|
411
|
-
extractVk(processMessagesZkeyPathNonQv.zkey),
|
|
412
|
-
extractVk(tallyVotesZkeyPathNonQv.zkey),
|
|
413
|
-
extractVk(pollJoiningZkeyPath.zkey),
|
|
414
|
-
extractVk(pollJoinedZkeyPath.zkey),
|
|
415
|
-
]).then((vks) => vks.map((vk) => vk && VerifyingKey.fromObj(vk).asContractParam()));
|
|
416
|
-
const processZkeys = [qvProcessVk, nonQvProcessVk].filter(Boolean);
|
|
417
|
-
const tallyZkeys = [qvTallyVk, nonQvTallyVk].filter(Boolean);
|
|
418
|
-
// check if the keys are already set
|
|
419
|
-
const [isProcessVkSet, isProcessNonQvVkSet, isTallyVkSet, isTallyNonQvVkSet] = await Promise.all([
|
|
420
|
-
publicClient.readContract({
|
|
421
|
-
address: vkRegistryAddress,
|
|
422
|
-
abi: VkRegistryFactory.abi,
|
|
423
|
-
functionName: "hasProcessVk",
|
|
424
|
-
args: [
|
|
425
|
-
config.VkRegistry.args.stateTreeDepth,
|
|
426
|
-
config.VkRegistry.args.voteOptionTreeDepth,
|
|
427
|
-
config.VkRegistry.args.messageBatchSize,
|
|
428
|
-
EMode.QV,
|
|
429
|
-
],
|
|
430
|
-
}),
|
|
431
|
-
publicClient.readContract({
|
|
432
|
-
address: vkRegistryAddress,
|
|
433
|
-
abi: VkRegistryFactory.abi,
|
|
434
|
-
functionName: "hasProcessVk",
|
|
435
|
-
args: [
|
|
436
|
-
config.VkRegistry.args.stateTreeDepth,
|
|
437
|
-
config.VkRegistry.args.voteOptionTreeDepth,
|
|
438
|
-
config.VkRegistry.args.messageBatchSize,
|
|
439
|
-
EMode.NON_QV,
|
|
440
|
-
],
|
|
441
|
-
}),
|
|
442
|
-
publicClient.readContract({
|
|
443
|
-
address: vkRegistryAddress,
|
|
444
|
-
abi: VkRegistryFactory.abi,
|
|
445
|
-
functionName: "hasTallyVk",
|
|
446
|
-
args: [
|
|
447
|
-
config.VkRegistry.args.stateTreeDepth,
|
|
448
|
-
config.VkRegistry.args.intStateTreeDepth,
|
|
449
|
-
config.VkRegistry.args.voteOptionTreeDepth,
|
|
450
|
-
EMode.QV,
|
|
451
|
-
],
|
|
452
|
-
}),
|
|
453
|
-
publicClient.readContract({
|
|
454
|
-
address: vkRegistryAddress,
|
|
455
|
-
abi: VkRegistryFactory.abi,
|
|
456
|
-
functionName: "hasTallyVk",
|
|
457
|
-
args: [
|
|
458
|
-
config.VkRegistry.args.stateTreeDepth,
|
|
459
|
-
config.VkRegistry.args.intStateTreeDepth,
|
|
460
|
-
config.VkRegistry.args.voteOptionTreeDepth,
|
|
461
|
-
EMode.NON_QV,
|
|
462
|
-
],
|
|
463
|
-
}),
|
|
464
|
-
]);
|
|
465
|
-
if (isProcessVkSet && isProcessNonQvVkSet && isTallyVkSet && isTallyNonQvVkSet) {
|
|
466
|
-
this.logger.debug("Verifying keys are already set on the vk registry");
|
|
467
|
-
}
|
|
468
|
-
else {
|
|
469
|
-
await this.estimateGasAndSend(vkRegistryAddress, 0n, VkRegistryFactory.abi, "setVerifyingKeysBatch", [
|
|
470
|
-
config.VkRegistry.args.stateTreeDepth,
|
|
471
|
-
config.VkRegistry.args.intStateTreeDepth,
|
|
472
|
-
config.VkRegistry.args.voteOptionTreeDepth,
|
|
473
|
-
config.VkRegistry.args.messageBatchSize,
|
|
474
|
-
[EMode.QV, EMode.NON_QV],
|
|
475
|
-
pollJoiningVk,
|
|
476
|
-
pollJoinedVk,
|
|
477
|
-
processZkeys,
|
|
478
|
-
tallyZkeys,
|
|
479
|
-
], ErrorCodes.FAILED_TO_SET_VERIFYING_KEYS_ON_VK_REGISTRY.toString(), kernelClient, bundlerClient);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
catch (error) {
|
|
483
|
-
this.logger.error("Failed to set verifying keys on vk registry: ", error);
|
|
484
|
-
throw error;
|
|
485
|
-
}
|
|
486
|
-
// 5. maci (here we don't check whether one is already deployed, we just deploy it)
|
|
487
|
-
const emptyBallotRoots = genEmptyBallotRoots(config.MACI.stateTreeDepth);
|
|
488
|
-
const maciAddress = await this.deployAndStore(EContracts.MACI, [
|
|
489
|
-
pollFactoryAddress,
|
|
490
|
-
messageProcessorFactoryAddress,
|
|
491
|
-
tallyFactoryAddress,
|
|
492
|
-
policyAddress,
|
|
493
|
-
config.MACI.stateTreeDepth,
|
|
494
|
-
emptyBallotRoots,
|
|
495
|
-
], MACIFactory.abi, MACIFactory.linkBytecode({
|
|
496
|
-
"contracts/crypto/PoseidonT3.sol:PoseidonT3": "0x07490eba00dc4ACA6721D052Fa4C5002Aa077233",
|
|
497
|
-
"contracts/crypto/PoseidonT4.sol:PoseidonT4": "0xbb0e724CE02e5E7eDd31e632dc6e59F229a1126d",
|
|
498
|
-
"contracts/crypto/PoseidonT5.sol:PoseidonT5": "0xE0398F7DFAC494c530F6404AfEaC8669ABeD2679",
|
|
499
|
-
"contracts/crypto/PoseidonT6.sol:PoseidonT6": "0xfD77833F10a29c76A6a0ede235Eb651D744d0E2F",
|
|
500
|
-
}), kernelClient, bundlerClient, publicClient, chain);
|
|
501
|
-
// set the gate on the policy
|
|
502
|
-
await this.estimateGasAndSend(policyAddress, 0n, policyData.abi, "setTarget", [maciAddress], ErrorCodes.FAILED_TO_SET_MACI_INSTANCE_ON_POLICY.toString(), kernelClient, bundlerClient);
|
|
503
|
-
return { address: maciAddress };
|
|
374
|
+
const signer = await this.sessionKeysService.getCoordinatorSigner(chain, sessionKeyAddress, approval);
|
|
375
|
+
const policyContract = await this.deployAndSavePolicy(signer, chain, config.policy);
|
|
376
|
+
const policyAddress = await policyContract.getAddress();
|
|
377
|
+
// deploy the smart contracts
|
|
378
|
+
const maciAddresses = await deployMaci({
|
|
379
|
+
stateTreeDepth: config.MACI.stateTreeDepth,
|
|
380
|
+
signer,
|
|
381
|
+
signupPolicyAddress: policyAddress,
|
|
382
|
+
poseidonAddresses: config.Poseidon,
|
|
383
|
+
});
|
|
384
|
+
// set verifying keys
|
|
385
|
+
const { verifyingKeysRegistryContractAddress, verifierContractAddress } = maciAddresses;
|
|
386
|
+
const verifyingKeysArgs = await this.getVerifyingKeysArgs(signer, verifyingKeysRegistryContractAddress, config.VerifyingKeysRegistry.args, config.MACI.modes);
|
|
387
|
+
await setVerifyingKeys(verifyingKeysArgs);
|
|
388
|
+
// store the contracts
|
|
389
|
+
await Promise.all([
|
|
390
|
+
this.storage.register({
|
|
391
|
+
id: EContracts.Verifier,
|
|
392
|
+
contract: new BaseContract(verifierContractAddress, VerifierFactory.abi),
|
|
393
|
+
network: chain,
|
|
394
|
+
}),
|
|
395
|
+
this.storage.register({
|
|
396
|
+
id: EContracts.VerifyingKeysRegistry,
|
|
397
|
+
contract: new BaseContract(verifyingKeysRegistryContractAddress, VerifyingKeysRegistryFactory.abi),
|
|
398
|
+
network: chain,
|
|
399
|
+
}),
|
|
400
|
+
this.storage.register({
|
|
401
|
+
id: EContracts.MACI,
|
|
402
|
+
contract: new BaseContract(maciAddresses.maciContractAddress, MACIFactory.abi),
|
|
403
|
+
args: [
|
|
404
|
+
maciAddresses.pollFactoryContractAddress,
|
|
405
|
+
maciAddresses.messageProcessorFactoryContractAddress,
|
|
406
|
+
maciAddresses.tallyFactoryContractAddress,
|
|
407
|
+
policyAddress,
|
|
408
|
+
config.MACI.stateTreeDepth,
|
|
409
|
+
generateEmptyBallotRoots(config.MACI.stateTreeDepth).map((root) => root.toString()),
|
|
410
|
+
],
|
|
411
|
+
network: chain,
|
|
412
|
+
}),
|
|
413
|
+
]);
|
|
414
|
+
return { address: maciAddresses.maciContractAddress };
|
|
504
415
|
}
|
|
505
416
|
/**
|
|
506
417
|
* Deploy a poll
|
|
@@ -509,10 +420,7 @@ let DeployerService = DeployerService_1 = class DeployerService {
|
|
|
509
420
|
* @returns poll id
|
|
510
421
|
*/
|
|
511
422
|
async deployPoll({ approval, sessionKeyAddress, chain, config }) {
|
|
512
|
-
const
|
|
513
|
-
const bundlerClient = getBundlerClient(chain);
|
|
514
|
-
const kernelClient = await this.sessionKeysService.generateClientFromSessionKey(sessionKeyAddress, approval, chain);
|
|
515
|
-
const signer = await this.sessionKeysService.getKernelClientSigner(kernelClient);
|
|
423
|
+
const signer = await this.sessionKeysService.getCoordinatorSigner(chain, sessionKeyAddress, approval);
|
|
516
424
|
// check if there is a maci contract deployed on this chain
|
|
517
425
|
const maciAddress = this.storage.getAddress(EContracts.MACI, chain);
|
|
518
426
|
if (!maciAddress) {
|
|
@@ -523,89 +431,72 @@ let DeployerService = DeployerService_1 = class DeployerService {
|
|
|
523
431
|
if (!verifierAddress) {
|
|
524
432
|
throw new Error(ErrorCodes.VERIFIER_NOT_DEPLOYED.toString());
|
|
525
433
|
}
|
|
526
|
-
// check if there is a
|
|
527
|
-
const
|
|
528
|
-
if (!
|
|
529
|
-
throw new Error(ErrorCodes.
|
|
530
|
-
}
|
|
531
|
-
// check if policy address was given
|
|
532
|
-
let policyAddress = config.policy.address;
|
|
533
|
-
if (!policyAddress) {
|
|
534
|
-
const policyData = this.getPolicyData(config.policy.type, chain, config.policy.args);
|
|
535
|
-
policyAddress = policyData.address;
|
|
536
|
-
// if the policy is not already deployed, we need to deploy it
|
|
537
|
-
if (!policyData.alreadyDeployed) {
|
|
538
|
-
policyAddress = await this.deployAndStore(config.policy.type, config.policy.args ? Object.values(config.policy.args) : [], policyData.abi, policyData.bytecode, kernelClient, bundlerClient, publicClient, chain);
|
|
539
|
-
}
|
|
434
|
+
// check if there is a verifyingKey registry deployed on this chain
|
|
435
|
+
const verifyingKeysRegistryAddress = this.storage.getAddress(EContracts.VerifyingKeysRegistry, chain);
|
|
436
|
+
if (!verifyingKeysRegistryAddress) {
|
|
437
|
+
throw new Error(ErrorCodes.VERIFYING_KEYS_REGISTRY_NOT_DEPLOYED.toString());
|
|
540
438
|
}
|
|
439
|
+
const policyContract = await this.deployAndSavePolicy(signer, chain, config.policy);
|
|
440
|
+
const policyAddress = (await policyContract.getAddress());
|
|
541
441
|
// check if initial voice credit proxy address was given
|
|
542
442
|
let initialVoiceCreditProxyAddress = config.initialVoiceCreditsProxy.address;
|
|
543
443
|
if (!initialVoiceCreditProxyAddress) {
|
|
544
|
-
const
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
if (!voiceCreditProxyData.alreadyDeployed) {
|
|
548
|
-
initialVoiceCreditProxyAddress = await this.deployAndStore(config.initialVoiceCreditsProxy.type, Object.values(config.initialVoiceCreditsProxy.args), voiceCreditProxyData.abi, voiceCreditProxyData.bytecode, kernelClient, bundlerClient, publicClient, chain);
|
|
549
|
-
}
|
|
444
|
+
const initialVoiceCreditProxyFactory = await this.deployAndSaveVoiceCreditProxyFactory(signer, config.initialVoiceCreditsProxy.factoryType, chain);
|
|
445
|
+
const initialVoiceCreditProxyContract = await this.deployAndSaveVoiceCreditProxy(signer, config.initialVoiceCreditsProxy.type, chain, initialVoiceCreditProxyFactory, config.initialVoiceCreditsProxy.args);
|
|
446
|
+
initialVoiceCreditProxyAddress = await initialVoiceCreditProxyContract.getAddress();
|
|
550
447
|
}
|
|
551
|
-
|
|
448
|
+
// instantiate the coordinator MACI keypair
|
|
449
|
+
const coordinatorKeypair = getCoordinatorKeypair();
|
|
552
450
|
const deployPollArgs = {
|
|
553
451
|
maciAddress,
|
|
554
452
|
pollStartTimestamp: config.startDate,
|
|
555
453
|
pollEndTimestamp: config.endDate,
|
|
556
|
-
|
|
454
|
+
tallyProcessingStateTreeDepth: config.tallyProcessingStateTreeDepth,
|
|
557
455
|
voteOptionTreeDepth: config.voteOptionTreeDepth,
|
|
558
456
|
messageBatchSize: config.messageBatchSize,
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
mode,
|
|
457
|
+
stateTreeDepth: config.pollStateTreeDepth,
|
|
458
|
+
coordinatorPublicKey: coordinatorKeypair.publicKey,
|
|
459
|
+
mode: config.mode,
|
|
563
460
|
policyContractAddress: policyAddress,
|
|
564
461
|
initialVoiceCreditProxyContractAddress: initialVoiceCreditProxyAddress,
|
|
565
|
-
relayers: config.relayers ? config.relayers
|
|
462
|
+
relayers: config.relayers ? config.relayers : [],
|
|
566
463
|
voteOptions: Number(config.voteOptions),
|
|
567
464
|
initialVoiceCredits: Number(config.initialVoiceCreditsProxy.args.amount),
|
|
568
465
|
signer,
|
|
569
466
|
};
|
|
570
467
|
const { pollContractAddress, messageProcessorContractAddress, tallyContractAddress, pollId } = await deployPoll(deployPollArgs);
|
|
571
468
|
const poll = PollFactory.connect(pollContractAddress, signer);
|
|
572
|
-
// read the emptyBallotRoot and extContracts
|
|
573
|
-
const emptyBallotRoot = await poll.emptyBallotRoot();
|
|
574
|
-
const extContracts = await poll.extContracts();
|
|
575
469
|
// store to storage
|
|
576
470
|
await Promise.all([
|
|
577
471
|
this.storage.register({
|
|
578
472
|
id: EContracts.Poll,
|
|
579
473
|
key: `poll-${pollId}`,
|
|
580
474
|
contract: poll,
|
|
581
|
-
args
|
|
582
|
-
|
|
583
|
-
...deployPollArgs,
|
|
584
|
-
extContracts,
|
|
585
|
-
emptyBallotRoot: emptyBallotRoot.toString(),
|
|
586
|
-
},
|
|
587
|
-
],
|
|
475
|
+
// clones do not have args for verification
|
|
476
|
+
args: [],
|
|
588
477
|
network: chain,
|
|
589
478
|
}),
|
|
590
479
|
this.storage.register({
|
|
591
480
|
id: EContracts.MessageProcessor,
|
|
592
481
|
key: `poll-${pollId}`,
|
|
593
|
-
contract:
|
|
594
|
-
|
|
482
|
+
contract: MessageProcessorFactory.connect(messageProcessorContractAddress, signer),
|
|
483
|
+
// clones do not have args for verification
|
|
484
|
+
args: [],
|
|
595
485
|
network: chain,
|
|
596
486
|
}),
|
|
597
487
|
this.storage.register({
|
|
598
488
|
id: EContracts.Tally,
|
|
599
489
|
key: `poll-${pollId}`,
|
|
600
|
-
contract:
|
|
601
|
-
|
|
490
|
+
contract: TallyFactory.connect(tallyContractAddress, signer),
|
|
491
|
+
// clones do not have args for verification
|
|
492
|
+
args: [],
|
|
602
493
|
network: chain,
|
|
603
494
|
}),
|
|
604
495
|
]);
|
|
605
496
|
return { pollId: pollId.toString() };
|
|
606
497
|
}
|
|
607
498
|
};
|
|
608
|
-
DeployerService =
|
|
499
|
+
DeployerService = __decorate([
|
|
609
500
|
Injectable(),
|
|
610
501
|
__metadata("design:paramtypes", [SessionKeysService,
|
|
611
502
|
FileService])
|