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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +71 -10
  3. package/build/hardhat.config.cjs +17 -9
  4. package/build/hardhat.config.cjs.map +1 -1
  5. package/build/hardhat.config.d.cts +15 -12
  6. package/build/hardhat.config.d.cts.map +1 -1
  7. package/build/scripts/generateKeypair.js +2 -2
  8. package/build/scripts/generateKeypair.js.map +1 -1
  9. package/build/scripts/generateMaciKeyPair.js +2 -2
  10. package/build/scripts/generateMaciKeyPair.js.map +1 -1
  11. package/build/tests/constants.d.ts +3 -4
  12. package/build/tests/constants.d.ts.map +1 -1
  13. package/build/tests/constants.js +5 -4
  14. package/build/tests/constants.js.map +1 -1
  15. package/build/tests/e2e.deploy.test.js +132 -102
  16. package/build/tests/e2e.deploy.test.js.map +1 -1
  17. package/build/tests/e2e.redis.test.d.ts +2 -0
  18. package/build/tests/e2e.redis.test.d.ts.map +1 -0
  19. package/build/tests/e2e.redis.test.js +118 -0
  20. package/build/tests/e2e.redis.test.js.map +1 -0
  21. package/build/tests/utils.d.ts +7 -1
  22. package/build/tests/utils.d.ts.map +1 -1
  23. package/build/tests/utils.js +17 -6
  24. package/build/tests/utils.js.map +1 -1
  25. package/build/ts/app.module.d.ts.map +1 -1
  26. package/build/ts/app.module.js +6 -0
  27. package/build/ts/app.module.js.map +1 -1
  28. package/build/ts/common/__tests__/common.test.js +44 -46
  29. package/build/ts/common/__tests__/common.test.js.map +1 -1
  30. package/build/ts/common/accountAbstraction.d.ts +7 -24
  31. package/build/ts/common/accountAbstraction.d.ts.map +1 -1
  32. package/build/ts/common/accountAbstraction.js +22 -49
  33. package/build/ts/common/accountAbstraction.js.map +1 -1
  34. package/build/ts/common/chain.d.ts +22 -0
  35. package/build/ts/common/chain.d.ts.map +1 -0
  36. package/build/ts/common/chain.js +37 -0
  37. package/build/ts/common/chain.js.map +1 -0
  38. package/build/ts/common/coordinatorKeypair.d.ts +7 -0
  39. package/build/ts/common/coordinatorKeypair.d.ts.map +1 -0
  40. package/build/ts/common/coordinatorKeypair.js +14 -0
  41. package/build/ts/common/coordinatorKeypair.js.map +1 -0
  42. package/build/ts/common/errors.d.ts +13 -10
  43. package/build/ts/common/errors.d.ts.map +1 -1
  44. package/build/ts/common/errors.js +12 -9
  45. package/build/ts/common/errors.js.map +1 -1
  46. package/build/ts/common/http.d.ts +6 -0
  47. package/build/ts/common/http.d.ts.map +1 -0
  48. package/build/ts/common/http.js +49 -0
  49. package/build/ts/common/http.js.map +1 -0
  50. package/build/ts/common/index.d.ts +3 -1
  51. package/build/ts/common/index.d.ts.map +1 -1
  52. package/build/ts/common/index.js +3 -1
  53. package/build/ts/common/index.js.map +1 -1
  54. package/build/ts/common/networks.d.ts +2 -21
  55. package/build/ts/common/networks.d.ts.map +1 -1
  56. package/build/ts/common/networks.js +39 -48
  57. package/build/ts/common/networks.js.map +1 -1
  58. package/build/ts/common/types.d.ts +3 -4
  59. package/build/ts/common/types.d.ts.map +1 -1
  60. package/build/ts/deployer/__tests__/deployer.controller.test.js +23 -25
  61. package/build/ts/deployer/__tests__/deployer.controller.test.js.map +1 -1
  62. package/build/ts/deployer/__tests__/deployer.service.test.js +184 -337
  63. package/build/ts/deployer/__tests__/deployer.service.test.js.map +1 -1
  64. package/build/ts/deployer/__tests__/utils.d.ts +31 -6
  65. package/build/ts/deployer/__tests__/utils.d.ts.map +1 -1
  66. package/build/ts/deployer/__tests__/utils.js +48 -22
  67. package/build/ts/deployer/__tests__/utils.js.map +1 -1
  68. package/build/ts/deployer/deployer.controller.d.ts.map +1 -1
  69. package/build/ts/deployer/deployer.controller.js +19 -6
  70. package/build/ts/deployer/deployer.controller.js.map +1 -1
  71. package/build/ts/deployer/deployer.service.d.ts +26 -53
  72. package/build/ts/deployer/deployer.service.d.ts.map +1 -1
  73. package/build/ts/deployer/deployer.service.js +345 -454
  74. package/build/ts/deployer/deployer.service.js.map +1 -1
  75. package/build/ts/deployer/dto.d.ts +7 -7
  76. package/build/ts/deployer/dto.d.ts.map +1 -1
  77. package/build/ts/deployer/dto.js +14 -6
  78. package/build/ts/deployer/dto.js.map +1 -1
  79. package/build/ts/deployer/types.d.ts +103 -45
  80. package/build/ts/deployer/types.d.ts.map +1 -1
  81. package/build/ts/file/__tests__/file.service.test.js +12 -11
  82. package/build/ts/file/__tests__/file.service.test.js.map +1 -1
  83. package/build/ts/file/file.service.d.ts +4 -3
  84. package/build/ts/file/file.service.d.ts.map +1 -1
  85. package/build/ts/file/file.service.js +16 -10
  86. package/build/ts/file/file.service.js.map +1 -1
  87. package/build/ts/file/types.d.ts +2 -2
  88. package/build/ts/file/types.d.ts.map +1 -1
  89. package/build/ts/health/__tests__/health.controller.test.d.ts +2 -0
  90. package/build/ts/health/__tests__/health.controller.test.d.ts.map +1 -0
  91. package/build/ts/health/__tests__/health.controller.test.js +52 -0
  92. package/build/ts/health/__tests__/health.controller.test.js.map +1 -0
  93. package/build/ts/health/__tests__/health.service.test.d.ts +2 -0
  94. package/build/ts/health/__tests__/health.service.test.d.ts.map +1 -0
  95. package/build/ts/health/__tests__/health.service.test.js +101 -0
  96. package/build/ts/health/__tests__/health.service.test.js.map +1 -0
  97. package/build/ts/health/health.controller.d.ts +16 -0
  98. package/build/ts/health/health.controller.d.ts.map +1 -0
  99. package/build/ts/health/health.controller.js +43 -0
  100. package/build/ts/health/health.controller.js.map +1 -0
  101. package/build/ts/health/health.module.d.ts +3 -0
  102. package/build/ts/health/health.module.d.ts.map +1 -0
  103. package/build/ts/health/health.module.js +22 -0
  104. package/build/ts/health/health.module.js.map +1 -0
  105. package/build/ts/health/health.service.d.ts +42 -0
  106. package/build/ts/health/health.service.d.ts.map +1 -0
  107. package/build/ts/health/health.service.js +176 -0
  108. package/build/ts/health/health.service.js.map +1 -0
  109. package/build/ts/health/types.d.ts +87 -0
  110. package/build/ts/health/types.d.ts.map +1 -0
  111. package/build/ts/health/types.js +2 -0
  112. package/build/ts/health/types.js.map +1 -0
  113. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts +11 -0
  114. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.d.ts.map +1 -0
  115. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js +12 -0
  116. package/build/ts/jest/__mocks__/@openzeppelin/merkle-tree.js.map +1 -0
  117. package/build/ts/main.js +1 -1
  118. package/build/ts/proof/__tests__/proof.controller.test.js +8 -7
  119. package/build/ts/proof/__tests__/proof.controller.test.js.map +1 -1
  120. package/build/ts/proof/__tests__/proof.gateway.test.js +5 -3
  121. package/build/ts/proof/__tests__/proof.gateway.test.js.map +1 -1
  122. package/build/ts/proof/__tests__/proof.service.test.js +31 -75
  123. package/build/ts/proof/__tests__/proof.service.test.js.map +1 -1
  124. package/build/ts/proof/dto.d.ts +15 -18
  125. package/build/ts/proof/dto.d.ts.map +1 -1
  126. package/build/ts/proof/dto.js +55 -49
  127. package/build/ts/proof/dto.js.map +1 -1
  128. package/build/ts/proof/proof.controller.d.ts +3 -2
  129. package/build/ts/proof/proof.controller.d.ts.map +1 -1
  130. package/build/ts/proof/proof.controller.js +38 -15
  131. package/build/ts/proof/proof.controller.js.map +1 -1
  132. package/build/ts/proof/proof.module.d.ts.map +1 -1
  133. package/build/ts/proof/proof.module.js +1 -0
  134. package/build/ts/proof/proof.module.js.map +1 -1
  135. package/build/ts/proof/proof.service.d.ts +4 -6
  136. package/build/ts/proof/proof.service.d.ts.map +1 -1
  137. package/build/ts/proof/proof.service.js +48 -130
  138. package/build/ts/proof/proof.service.js.map +1 -1
  139. package/build/ts/proof/types.d.ts +21 -17
  140. package/build/ts/proof/types.d.ts.map +1 -1
  141. package/build/ts/proof/types.js.map +1 -1
  142. package/build/ts/redis/__tests__/redis.service.test.d.ts +2 -0
  143. package/build/ts/redis/__tests__/redis.service.test.d.ts.map +1 -0
  144. package/build/ts/redis/__tests__/redis.service.test.js +148 -0
  145. package/build/ts/redis/__tests__/redis.service.test.js.map +1 -0
  146. package/build/ts/redis/redis.module.d.ts +3 -0
  147. package/build/ts/redis/redis.module.d.ts.map +1 -0
  148. package/build/ts/redis/redis.module.js +18 -0
  149. package/build/ts/redis/redis.module.js.map +1 -0
  150. package/build/ts/redis/redis.service.d.ts +53 -0
  151. package/build/ts/redis/redis.service.d.ts.map +1 -0
  152. package/build/ts/redis/redis.service.js +99 -0
  153. package/build/ts/redis/redis.service.js.map +1 -0
  154. package/build/ts/redis/types.d.ts +66 -0
  155. package/build/ts/redis/types.d.ts.map +1 -0
  156. package/build/ts/redis/types.js +2 -0
  157. package/build/ts/redis/types.js.map +1 -0
  158. package/build/ts/redis/utils.d.ts +20 -0
  159. package/build/ts/redis/utils.d.ts.map +1 -0
  160. package/build/ts/redis/utils.js +27 -0
  161. package/build/ts/redis/utils.js.map +1 -0
  162. package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts +2 -0
  163. package/build/ts/scheduler/__tests__/scheduler.controller.test.d.ts.map +1 -0
  164. package/build/ts/scheduler/__tests__/scheduler.controller.test.js +62 -0
  165. package/build/ts/scheduler/__tests__/scheduler.controller.test.js.map +1 -0
  166. package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts +2 -0
  167. package/build/ts/scheduler/__tests__/scheduler.service.test.d.ts.map +1 -0
  168. package/build/ts/scheduler/__tests__/scheduler.service.test.js +369 -0
  169. package/build/ts/scheduler/__tests__/scheduler.service.test.js.map +1 -0
  170. package/build/ts/scheduler/dto.d.ts +41 -0
  171. package/build/ts/scheduler/dto.d.ts.map +1 -0
  172. package/build/ts/scheduler/dto.js +115 -0
  173. package/build/ts/scheduler/dto.js.map +1 -0
  174. package/build/ts/scheduler/scheduler.controller.d.ts +32 -0
  175. package/build/ts/scheduler/scheduler.controller.d.ts.map +1 -0
  176. package/build/ts/scheduler/scheduler.controller.js +118 -0
  177. package/build/ts/scheduler/scheduler.controller.js.map +1 -0
  178. package/build/ts/scheduler/scheduler.module.d.ts +3 -0
  179. package/build/ts/scheduler/scheduler.module.d.ts.map +1 -0
  180. package/build/ts/scheduler/scheduler.module.js +24 -0
  181. package/build/ts/scheduler/scheduler.module.js.map +1 -0
  182. package/build/ts/scheduler/scheduler.service.d.ts +71 -0
  183. package/build/ts/scheduler/scheduler.service.d.ts.map +1 -0
  184. package/build/ts/scheduler/scheduler.service.js +297 -0
  185. package/build/ts/scheduler/scheduler.service.js.map +1 -0
  186. package/build/ts/scheduler/types.d.ts +65 -0
  187. package/build/ts/scheduler/types.d.ts.map +1 -0
  188. package/build/ts/scheduler/types.js +2 -0
  189. package/build/ts/scheduler/types.js.map +1 -0
  190. package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js +2 -2
  191. package/build/ts/sessionKeys/__tests__/sessionKeys.controller.test.js.map +1 -1
  192. package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js +34 -19
  193. package/build/ts/sessionKeys/__tests__/sessionKeys.service.test.js.map +1 -1
  194. package/build/ts/sessionKeys/__tests__/utils.d.ts +1 -1
  195. package/build/ts/sessionKeys/__tests__/utils.d.ts.map +1 -1
  196. package/build/ts/sessionKeys/__tests__/utils.js +7 -6
  197. package/build/ts/sessionKeys/__tests__/utils.js.map +1 -1
  198. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts +53 -0
  199. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.d.ts.map +1 -0
  200. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.js +105 -0
  201. package/build/ts/sessionKeys/provider/KernelEIP1193Provider.js.map +1 -0
  202. package/build/ts/sessionKeys/sessionKeys.service.d.ts +16 -4
  203. package/build/ts/sessionKeys/sessionKeys.service.d.ts.map +1 -1
  204. package/build/ts/sessionKeys/sessionKeys.service.js +23 -6
  205. package/build/ts/sessionKeys/sessionKeys.service.js.map +1 -1
  206. package/build/ts/subgraph/__tests__/subgraph.controller.test.js +3 -3
  207. package/build/ts/subgraph/__tests__/subgraph.controller.test.js.map +1 -1
  208. package/build/ts/subgraph/__tests__/subgraph.gateway.test.js +2 -2
  209. package/build/ts/subgraph/__tests__/subgraph.gateway.test.js.map +1 -1
  210. package/build/ts/subgraph/__tests__/subgraph.service.test.js +5 -5
  211. package/build/ts/subgraph/__tests__/subgraph.service.test.js.map +1 -1
  212. package/build/ts/subgraph/dto.d.ts +2 -2
  213. package/build/ts/subgraph/dto.d.ts.map +1 -1
  214. package/build/ts/subgraph/dto.js +3 -3
  215. package/build/ts/subgraph/dto.js.map +1 -1
  216. package/build/ts/subgraph/subgraph.controller.d.ts.map +1 -1
  217. package/build/ts/subgraph/subgraph.controller.js +8 -3
  218. package/build/ts/subgraph/subgraph.controller.js.map +1 -1
  219. package/build/ts/subgraph/subgraph.service.d.ts +4 -0
  220. package/build/ts/subgraph/subgraph.service.d.ts.map +1 -1
  221. package/build/ts/subgraph/subgraph.service.js +23 -10
  222. package/build/ts/subgraph/subgraph.service.js.map +1 -1
  223. package/build/ts/subgraph/types.d.ts +2 -2
  224. package/build/ts/subgraph/types.d.ts.map +1 -1
  225. package/build/tsconfig.build.tsbuildinfo +1 -1
  226. package/package.json +46 -39
  227. package/build/tests/e2e.aa.test.d.ts +0 -2
  228. package/build/tests/e2e.aa.test.d.ts.map +0 -1
  229. package/build/tests/e2e.aa.test.js +0 -103
  230. package/build/tests/e2e.aa.test.js.map +0 -1
  231. package/build/ts/deployer/utils.d.ts +0 -8
  232. package/build/ts/deployer/utils.d.ts.map +0 -1
  233. package/build/ts/deployer/utils.js +0 -9
  234. package/build/ts/deployer/utils.js.map +0 -1
@@ -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
- var DeployerService_1;
11
- import { PubKey, VerifyingKey } from "@maci-protocol/domainobjs";
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 { getBundlerClient, getDeployedContractAddress, getPublicClient } from "../common/accountAbstraction";
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 = DeployerService_1 = class 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.logger = new Logger(DeployerService_1.name);
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 abi and bytecode based on the policy type
50
- * and also check if there is already an instance deployed
38
+ * Get the policy contract object
39
+ * always deploy and save it
51
40
  *
52
- * @param policyType - the policy type
41
+ * @param signer - the signer
53
42
  * @param network - the network
54
- * @param args - the policy args
55
- * @returns - the policy abi and bytecode
43
+ * @param policyConfig - the policy configuration parameters
44
+ * @returns - the policy contract
56
45
  */
57
- getPolicyData(policyType, network, args) {
58
- const address = this.storage.getAddress(policyType, network);
59
- let storedArgs;
60
- let isAlreadyDeployed;
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
- return {
65
- address,
66
- abi: FreeForAllPolicyFactory.abi,
67
- bytecode: FreeForAllPolicyFactory.bytecode,
68
- alreadyDeployed: !!address,
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
- storedArgs = this.storage.getContractArgs(policyType, network);
73
- isAlreadyDeployed =
74
- !!storedArgs &&
75
- storedArgs.length === 3 &&
76
- storedArgs[0] === args.easAddress &&
77
- storedArgs[1] === args.schema &&
78
- storedArgs[2] === args.attester;
79
- return {
80
- address: isAlreadyDeployed ? address : undefined,
81
- abi: EASPolicyFactory.abi,
82
- bytecode: EASPolicyFactory.bytecode,
83
- alreadyDeployed: isAlreadyDeployed,
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.Zupass: {
87
- storedArgs = this.storage.getContractArgs(policyType, network);
88
- isAlreadyDeployed =
89
- !!storedArgs &&
90
- storedArgs.length === 4 &&
91
- storedArgs[0] === args.signer1 &&
92
- storedArgs[1] === args.signer2 &&
93
- storedArgs[2] === args.eventId &&
94
- storedArgs[3] === args.zupassVerifier;
95
- return {
96
- address: isAlreadyDeployed ? address : undefined,
97
- abi: ZupassPolicyFactory.abi,
98
- bytecode: ZupassPolicyFactory.bytecode,
99
- alreadyDeployed: isAlreadyDeployed,
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
- storedArgs = this.storage.getContractArgs(policyType, network);
104
- isAlreadyDeployed =
105
- !!storedArgs &&
106
- storedArgs.length === 2 &&
107
- storedArgs[0] === args.hatsProtocolAddress &&
108
- JSON.stringify(storedArgs[1]) === JSON.stringify(args.critrionHats);
109
- return {
110
- address: isAlreadyDeployed ? address : undefined,
111
- abi: HatsPolicyFactory.abi,
112
- bytecode: HatsPolicyFactory.bytecode,
113
- alreadyDeployed: isAlreadyDeployed,
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
- storedArgs = this.storage.getContractArgs(policyType, network);
118
- isAlreadyDeployed =
119
- !!storedArgs &&
120
- storedArgs.length === 2 &&
121
- storedArgs[0] === args.semaphoreContract &&
122
- storedArgs[1] === args.groupId;
123
- return {
124
- address: isAlreadyDeployed ? address : undefined,
125
- abi: SemaphorePolicyFactory.abi,
126
- bytecode: SemaphorePolicyFactory.bytecode,
127
- alreadyDeployed: isAlreadyDeployed,
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.GitcoinPassport: {
131
- storedArgs = this.storage.getContractArgs(policyType, network);
132
- isAlreadyDeployed =
133
- !!storedArgs &&
134
- storedArgs.length === 2 &&
135
- storedArgs[0] === args.decoderAddress &&
136
- storedArgs[1] === args.passingScore;
137
- return {
138
- address: isAlreadyDeployed ? address : undefined,
139
- abi: GitcoinPassportPolicyFactory.abi,
140
- bytecode: GitcoinPassportPolicyFactory.bytecode,
141
- alreadyDeployed: isAlreadyDeployed,
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
- storedArgs = this.storage.getContractArgs(policyType, network);
146
- isAlreadyDeployed =
147
- !!storedArgs &&
148
- storedArgs.length === 3 &&
149
- storedArgs[0] === args.token &&
150
- storedArgs[1] === args.factor &&
151
- storedArgs[2] === args.snapshotBlock;
152
- return {
153
- address: isAlreadyDeployed ? address : undefined,
154
- abi: ERC20VotesPolicyFactory.abi,
155
- bytecode: ERC20VotesPolicyFactory.bytecode,
156
- alreadyDeployed: isAlreadyDeployed,
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 abi and bytecode based on the voice credit proxy type
165
- * and also check if there is already an instance deployed
263
+ * Get the voice credit proxy factory contract object
264
+ * always deploy and save it
166
265
  *
167
- * @param voiceCreditProxyType - the voice credit proxy type
266
+ * @param signer - the signer
267
+ * @param voiceCreditProxyFactoryType - the voice credit proxy factory type
168
268
  * @param network - the network
169
- * @param args - the voice credit proxy args
170
- * @returns - the voice credit proxy abi and bytecode
269
+ * @returns - the voice credit proxy factory contract
171
270
  */
172
- getVoiceCreditProxyData(voiceCreditProxyType, network, args) {
173
- let storedArgs;
174
- let isAlreadyDeployed;
175
- const address = this.storage.getAddress(voiceCreditProxyType, network);
176
- switch (voiceCreditProxyType) {
177
- case EInitialVoiceCreditProxies.Constant: {
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.UNSUPPORTED_VOICE_CREDIT_PROXY.toString());
279
+ throw new Error(ErrorCodes.UNSUPPORTED_VOICE_CREDIT_PROXY_FACTORY.toString());
189
280
  }
190
- }
191
- /**
192
- * @param abi - the abi
193
- * @param bytecode - the bytecode
194
- * @param args - the args
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
- const receipt = await bundlerClient.waitForUserOperationReceipt({
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
- * Deploy a contract and store the address
290
+ * Get the voice credit proxy contract object
291
+ * always deploy and save it
231
292
  *
232
- * @param contract - the contract to deploy
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
- * @param abi - the abi
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 deployAndStore(contract, args, abi, bytecode, kernelClient, bundlerClient, publicClient, chain) {
242
- let address = this.storage.getAddress(contract, chain);
243
- if (!address) {
244
- address = await this.deployAndGetAddress(kernelClient, abi, bytecode, args, bundlerClient, publicClient);
245
- if (!address) {
246
- this.logger.error(`Failed to deploy contract: ${contract}`);
247
- throw new Error(`${ErrorCodes.FAILED_TO_DEPLOY_CONTRACT} ${contract}`);
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
- await this.storage.register({
250
- id: contract,
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
- return address;
262
- }
263
- /**
264
- * Estimate gas, add a bit extra and send the user operation (aka. transaction)
265
- * @param to - the to address of the user operation
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
- const receipt = await bundlerClient.waitForUserOperationReceipt({ hash: userOperationHash });
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 vkRegistryContract - the deployed vk registry contract
310
- * @param vkRegistryArgs - the arguments send to the endpoint
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, vkRegistryContract, vkRegistryArgs, mode) {
315
- const pollJoiningZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINING_ZKEY_NAME, true).zkey;
316
- const pollJoinedZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_POLL_JOINED_ZKEY_NAME, true).zkey;
317
- const processMessagesZkeyPath = this.fileService.getZkeyFilePaths(process.env.COORDINATOR_MESSAGE_PROCESS_ZKEY_NAME, mode === EMode.QV).zkey;
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 { stateTreeDepth, intStateTreeDepth, voteOptionTreeDepth, messageBatchSize } = vkRegistryArgs;
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
- pollJoiningVk: pollJoiningVk,
328
- pollJoinedVk: pollJoinedVk,
329
- processMessagesVk: processVk,
330
- tallyVotesVk: tallyVk,
351
+ pollJoiningVerifyingKey: pollJoiningVerifyingKey,
352
+ pollJoinedVerifyingKey: pollJoinedVerifyingKey,
353
+ processMessagesVerifyingKeys: processVerifyingKeys,
354
+ tallyVotesVerifyingKeys: tallyVerifyingKeys,
331
355
  stateTreeDepth: Number(stateTreeDepth),
332
- intStateTreeDepth: Number(intStateTreeDepth),
356
+ tallyProcessingStateTreeDepth: Number(tallyProcessingStateTreeDepth),
333
357
  voteOptionTreeDepth: Number(voteOptionTreeDepth),
334
358
  messageBatchSize: Number(messageBatchSize),
359
+ pollStateTreeDepth: Number(pollStateTreeDepth),
335
360
  signer,
336
- mode,
337
- vkRegistryAddress: await vkRegistryContract.getAddress(),
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 publicClient = getPublicClient(chain);
350
- const bundlerClient = getBundlerClient(chain);
351
- const kernelClient = await this.sessionKeysService.generateClientFromSessionKey(sessionKeyAddress, approval, chain);
352
- let policyAddress = this.storage.getAddress(config.policy.type, chain);
353
- const policyData = this.getPolicyData(config.policy.type, chain, config.policy.args);
354
- // if the policy is not already deployed, we need to deploy it
355
- if (!policyData.alreadyDeployed) {
356
- policyAddress = await this.deployAndStore(config.policy.type, config.policy.args ? Object.values(config.policy.args) : [], policyData.abi, policyData.bytecode, kernelClient, bundlerClient, publicClient, chain);
357
- }
358
- // deploy all maci contracts
359
- // (we are not using Promise.all because the write tx nonce should be sequential)
360
- // 1. verifier
361
- await this.deployAndStore(EContracts.Verifier, [], VerifierFactory.abi, VerifierFactory.bytecode, kernelClient, bundlerClient, publicClient, chain);
362
- // 2. poseidon
363
- let poseidonT3Address;
364
- let poseidonT4Address;
365
- let poseidonT5Address;
366
- let poseidonT6Address;
367
- if (config.Poseidon) {
368
- // Some times the poseidon contracts are already deployed so we don't need to deploy them again
369
- poseidonT3Address = config.Poseidon.poseidonT3;
370
- poseidonT4Address = config.Poseidon.poseidonT4;
371
- poseidonT5Address = config.Poseidon.poseidonT5;
372
- poseidonT6Address = config.Poseidon.poseidonT6;
373
- }
374
- else {
375
- poseidonT3Address = await this.deployAndStore(EContracts.PoseidonT3, [], PoseidonT3Factory.abi, PoseidonT3Factory.bytecode, kernelClient, bundlerClient, publicClient, chain);
376
- poseidonT4Address = await this.deployAndStore(EContracts.PoseidonT4, [], PoseidonT4Factory.abi, PoseidonT4Factory.bytecode, kernelClient, bundlerClient, publicClient, chain);
377
- poseidonT5Address = await this.deployAndStore(EContracts.PoseidonT5, [], PoseidonT5Factory.abi, PoseidonT5Factory.bytecode, kernelClient, bundlerClient, publicClient, chain);
378
- poseidonT6Address = await this.deployAndStore(EContracts.PoseidonT6, [], PoseidonT6Factory.abi, PoseidonT6Factory.bytecode, kernelClient, bundlerClient, publicClient, chain);
379
- }
380
- // 3. factories
381
- const pollFactoryAddress = await this.deployAndStore(EContracts.PollFactory, [], PollFactoryFactory.abi, PollFactoryFactory.linkBytecode({
382
- "contracts/crypto/PoseidonT3.sol:PoseidonT3": poseidonT3Address,
383
- "contracts/crypto/PoseidonT4.sol:PoseidonT4": poseidonT4Address,
384
- "contracts/crypto/PoseidonT5.sol:PoseidonT5": poseidonT5Address,
385
- "contracts/crypto/PoseidonT6.sol:PoseidonT6": poseidonT6Address,
386
- }), kernelClient, bundlerClient, publicClient, chain);
387
- const tallyFactoryAddress = await this.deployAndStore(EContracts.TallyFactory, [], TallyFactoryFactory.abi, TallyFactoryFactory.linkBytecode({
388
- "contracts/crypto/PoseidonT3.sol:PoseidonT3": poseidonT3Address,
389
- "contracts/crypto/PoseidonT4.sol:PoseidonT4": poseidonT4Address,
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 publicClient = getPublicClient(chain);
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 vk registry deployed on this chain
527
- const vkRegistryAddress = this.storage.getAddress(EContracts.VkRegistry, chain);
528
- if (!vkRegistryAddress) {
529
- throw new Error(ErrorCodes.VK_REGISTRY_NOT_DEPLOYED.toString());
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 voiceCreditProxyData = this.getVoiceCreditProxyData(config.initialVoiceCreditsProxy.type, chain, config.initialVoiceCreditsProxy.args);
545
- initialVoiceCreditProxyAddress = voiceCreditProxyData.address;
546
- // if the voice credit proxy is not already deployed, we need to deploy it
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
- const mode = config.useQuadraticVoting ? EMode.QV : EMode.NON_QV;
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
- intStateTreeDepth: config.intStateTreeDepth,
454
+ tallyProcessingStateTreeDepth: config.tallyProcessingStateTreeDepth,
557
455
  voteOptionTreeDepth: config.voteOptionTreeDepth,
558
456
  messageBatchSize: config.messageBatchSize,
559
- coordinatorPubKey: PubKey.deserialize(config.coordinatorPubkey),
560
- verifierContractAddress: verifierAddress,
561
- vkRegistryContractAddress: vkRegistryAddress,
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.map((address) => address) : [],
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: new BaseContract(messageProcessorContractAddress, MessageProcessorFactory.abi),
594
- args: [verifierAddress, vkRegistryAddress, pollContractAddress, mode],
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: new BaseContract(tallyContractAddress, TallyFactory.abi),
601
- args: [verifierAddress, vkRegistryAddress, pollContractAddress, messageProcessorContractAddress, mode],
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 = DeployerService_1 = __decorate([
499
+ DeployerService = __decorate([
609
500
  Injectable(),
610
501
  __metadata("design:paramtypes", [SessionKeysService,
611
502
  FileService])