@maci-protocol/circuits 0.0.0-ci.185b643

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 (39) hide show
  1. package/CHANGELOG.md +673 -0
  2. package/LICENSE +22 -0
  3. package/README.md +20 -0
  4. package/build/ts/compile.d.ts +10 -0
  5. package/build/ts/compile.d.ts.map +1 -0
  6. package/build/ts/compile.js +123 -0
  7. package/build/ts/compile.js.map +1 -0
  8. package/build/ts/genZkeys.d.ts +9 -0
  9. package/build/ts/genZkeys.d.ts.map +1 -0
  10. package/build/ts/genZkeys.js +67 -0
  11. package/build/ts/genZkeys.js.map +1 -0
  12. package/build/ts/info.d.ts +2 -0
  13. package/build/ts/info.d.ts.map +1 -0
  14. package/build/ts/info.js +72 -0
  15. package/build/ts/info.js.map +1 -0
  16. package/build/ts/types.d.ts +104 -0
  17. package/build/ts/types.d.ts.map +1 -0
  18. package/build/ts/types.js +3 -0
  19. package/build/ts/types.js.map +1 -0
  20. package/build/tsconfig.build.tsbuildinfo +1 -0
  21. package/circom/circuits.json +58 -0
  22. package/circom/coordinator/non-qv/processMessages.circom +443 -0
  23. package/circom/coordinator/non-qv/tallyVotes.circom +232 -0
  24. package/circom/coordinator/qv/processMessages.circom +445 -0
  25. package/circom/coordinator/qv/tallyVotes.circom +277 -0
  26. package/circom/utils/calculateTotal.circom +22 -0
  27. package/circom/utils/hashers.circom +78 -0
  28. package/circom/utils/messageToCommand.circom +78 -0
  29. package/circom/utils/non-qv/messageValidator.circom +89 -0
  30. package/circom/utils/non-qv/stateLeafAndBallotTransformer.circom +105 -0
  31. package/circom/utils/privToPubKey.circom +36 -0
  32. package/circom/utils/qv/messageValidator.circom +95 -0
  33. package/circom/utils/qv/stateLeafAndBallotTransformer.circom +105 -0
  34. package/circom/utils/trees/incrementalMerkleTree.circom +198 -0
  35. package/circom/utils/trees/incrementalQuinaryTree.circom +287 -0
  36. package/circom/utils/verifySignature.circom +117 -0
  37. package/circom/voter/poll.circom +91 -0
  38. package/circomkit.json +18 -0
  39. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Barry WhiteHat, Kendrick Tan, Kobi Gurkan, Kirill Goncharov
4
+ Cory Dickson, Han Jian, Chih-Cheng Liang, and Koh Wei Jie
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # Circuits
2
+
3
+ [![NPM Package][circuits-npm-badge]][circuits-npm-link]
4
+ [![Actions Status][circuits-actions-badge]][circuits-actions-link]
5
+
6
+ This package contains the zk-SNARK circuits written in Circom 2.0.
7
+
8
+ The main circuits are:
9
+
10
+ - `processMessages.circom`
11
+ - `tallyVotes.circom`
12
+
13
+ The rest of the circuits are utilities templates that are required for the main circuits to work correctly. These include utilities such as float math, conversion of private keys, and Poseidon hashing/encryption.
14
+
15
+ Please refer to the [documentation](https://maci.pse.dev/docs/category/zk-snark-circuits) for a more in depth explanation.
16
+
17
+ [circuits-npm-badge]: https://img.shields.io/npm/v/maci-circuits.svg
18
+ [circuits-npm-link]: https://www.npmjs.com/package/maci-circuits
19
+ [circuits-actions-badge]: https://github.com/privacy-scaling-explorations/maci/actions/workflows/circuit-build.yml/badge.svg
20
+ [circuits-actions-link]: https://github.com/privacy-scaling-explorations/maci/actions?query=workflow%3ACircuit
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Compile MACI's circuits using circomkit
3
+ * and setup the dir structure
4
+ * @param cWitness - whether to compile to the c witness generator
5
+ * or not
6
+ * @param outputPath - the path to the output folder
7
+ * @returns the build directory
8
+ */
9
+ export declare const compileCircuits: (cWitness?: boolean, outputPath?: string) => Promise<string>;
10
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../ts/compile.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAU,WAAW,OAAO,EAAE,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CA6D7F,CAAC"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.compileCircuits = void 0;
40
+ const circomkit_1 = require("circomkit");
41
+ const child_process_1 = __importDefault(require("child_process"));
42
+ const fs_1 = __importDefault(require("fs"));
43
+ const path_1 = __importDefault(require("path"));
44
+ /**
45
+ * Compile MACI's circuits using circomkit
46
+ * and setup the dir structure
47
+ * @param cWitness - whether to compile to the c witness generator
48
+ * or not
49
+ * @param outputPath - the path to the output folder
50
+ * @returns the build directory
51
+ */
52
+ const compileCircuits = async (cWitness, outputPath) => {
53
+ // read circomkit config files
54
+ const configFilePath = path_1.default.resolve(__dirname, "..", "circomkit.json");
55
+ const circomKitConfig = JSON.parse(await fs_1.default.promises.readFile(configFilePath, "utf-8"));
56
+ const circuitsConfigPath = path_1.default.resolve(__dirname, "..", "circom", "circuits.json");
57
+ const circuitsConfigContent = JSON.parse(await fs_1.default.promises.readFile(circuitsConfigPath, "utf-8"));
58
+ const circuitsConfigs = Object.entries(circuitsConfigContent).map(([name, config]) => ({
59
+ name,
60
+ ...config,
61
+ }));
62
+ // generate the absolute path to the output folder
63
+ const outputPathUpdated = outputPath ? path_1.default.resolve(outputPath) : undefined;
64
+ // set the config based on whether to compile the c witness or no
65
+ if (cWitness) {
66
+ circomKitConfig.cWitness = true;
67
+ }
68
+ else {
69
+ circomKitConfig.cWitness = false;
70
+ }
71
+ // update the build directory if we have an output path
72
+ if (outputPathUpdated) {
73
+ circomKitConfig.dirBuild = outputPathUpdated;
74
+ circomKitConfig.dirPtau = outputPathUpdated;
75
+ }
76
+ // create an instance of circomkit with a custom config
77
+ const circomkitInstance = new circomkit_1.Circomkit({
78
+ ...circomKitConfig,
79
+ verbose: false,
80
+ });
81
+ const { promisify } = await Promise.resolve().then(() => __importStar(require("util")));
82
+ const execFile = promisify(child_process_1.default.execFile);
83
+ // loop through each circuit config and compile them
84
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
85
+ for (let i = 0; i < circuitsConfigs.length; i += 1) {
86
+ const circuit = circuitsConfigs[i];
87
+ // eslint-disable-next-line no-console
88
+ console.log(`Compiling ${circuit.name}...`);
89
+ // eslint-disable-next-line no-await-in-loop
90
+ const outPath = await circomkitInstance.compile(circuit.name, circuit);
91
+ // if the circuit is compiled with a c witness, then let's run make in the directory
92
+ if (cWitness) {
93
+ try {
94
+ // build
95
+ // eslint-disable-next-line no-await-in-loop
96
+ await execFile("bash", ["-c", `cd ${outPath}/${circuit.name}_cpp && make`]);
97
+ }
98
+ catch (error) {
99
+ throw new Error(`Failed to compile the c witness for ${circuit.name}`);
100
+ }
101
+ }
102
+ }
103
+ // return the build directory
104
+ return circomKitConfig.dirBuild;
105
+ };
106
+ exports.compileCircuits = compileCircuits;
107
+ if (require.main === module) {
108
+ (async () => {
109
+ // check if we want to compile the c witness or not
110
+ const cWitness = process.argv.includes("--cWitness");
111
+ // the output path is the next argument after the --outPath flag
112
+ // and is not mandatory
113
+ const outputPathIndex = process.argv.indexOf("--outPath");
114
+ if (outputPathIndex === -1) {
115
+ await (0, exports.compileCircuits)(cWitness);
116
+ }
117
+ else {
118
+ const outputFolder = process.argv[outputPathIndex + 1];
119
+ await (0, exports.compileCircuits)(cWitness, outputFolder);
120
+ }
121
+ })();
122
+ }
123
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../ts/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generate the zkeys for MACI's circuits using circomkit
3
+ * @dev This should only be used for testing purposes, or to generate the genesis zkey
4
+ * for a new trusted setup ceremony. Never use zkeys that have not undergone a ceremony
5
+ * in production.
6
+ * @param outPath - the path to the output folder
7
+ */
8
+ export declare const generateZkeys: (outputPath?: string) => Promise<void>;
9
+ //# sourceMappingURL=genZkeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genZkeys.d.ts","sourceRoot":"","sources":["../../ts/genZkeys.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CA2CrE,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateZkeys = void 0;
7
+ const sdk_1 = require("@maci-protocol/sdk");
8
+ const circomkit_1 = require("circomkit");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ /**
12
+ * Generate the zkeys for MACI's circuits using circomkit
13
+ * @dev This should only be used for testing purposes, or to generate the genesis zkey
14
+ * for a new trusted setup ceremony. Never use zkeys that have not undergone a ceremony
15
+ * in production.
16
+ * @param outPath - the path to the output folder
17
+ */
18
+ const generateZkeys = async (outputPath) => {
19
+ // read circomkit config files
20
+ const configFilePath = path_1.default.resolve(__dirname, "..", "circomkit.json");
21
+ const circomKitConfig = JSON.parse(await fs_1.default.promises.readFile(configFilePath, "utf-8"));
22
+ const circuitsConfigPath = path_1.default.resolve(__dirname, "..", "circom", "circuits.json");
23
+ const circuitsConfigContent = JSON.parse(await fs_1.default.promises.readFile(circuitsConfigPath, "utf-8"));
24
+ const circuitsConfigs = Object.entries(circuitsConfigContent).map(([name, config]) => ({
25
+ name,
26
+ ...config,
27
+ }));
28
+ const outPath = outputPath ? path_1.default.resolve(outputPath) : undefined;
29
+ // update the output directory
30
+ if (outPath) {
31
+ circomKitConfig.dirBuild = outPath;
32
+ circomKitConfig.dirPtau = outPath;
33
+ }
34
+ const circomkitInstance = new circomkit_1.Circomkit({
35
+ ...circomKitConfig,
36
+ verbose: false,
37
+ });
38
+ // loop through each circuit config and compile them
39
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
40
+ for (let i = 0; i < circuitsConfigs.length; i += 1) {
41
+ const circuit = circuitsConfigs[i];
42
+ // eslint-disable-next-line no-console
43
+ console.log(`Generating zKey for ${circuit.name}...`);
44
+ // eslint-disable-next-line no-await-in-loop
45
+ const { proverKeyPath } = await circomkitInstance.setup(circuit.name);
46
+ // rename the zkey
47
+ const zkeyPath = path_1.default.resolve(circomKitConfig.dirBuild, circuit.name, `${circuit.name}.0.zkey`);
48
+ // eslint-disable-next-line no-await-in-loop
49
+ await fs_1.default.promises.rename(proverKeyPath, zkeyPath);
50
+ }
51
+ // clean up the threads so we can exit
52
+ await (0, sdk_1.cleanThreads)();
53
+ };
54
+ exports.generateZkeys = generateZkeys;
55
+ if (require.main === module) {
56
+ (async () => {
57
+ const outputPathIndex = process.argv.indexOf("--outPath");
58
+ if (outputPathIndex === -1) {
59
+ await (0, exports.generateZkeys)();
60
+ }
61
+ else {
62
+ const outputFolder = process.argv[process.argv.indexOf("--outPath") + 1];
63
+ await (0, exports.generateZkeys)(outputFolder);
64
+ }
65
+ })();
66
+ }
67
+ //# sourceMappingURL=genZkeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genZkeys.js","sourceRoot":"","sources":["../../ts/genZkeys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function info(zkeysPath: string): Promise<void>;
2
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../ts/info.ts"],"names":[],"mappings":"AASA,wBAAsB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B3D"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.info = info;
40
+ // eslint-disable-next-line import/no-extraneous-dependencies
41
+ const glob_1 = require("glob");
42
+ const child_process_1 = __importDefault(require("child_process"));
43
+ const fs_1 = __importDefault(require("fs"));
44
+ const path_1 = __importDefault(require("path"));
45
+ async function info(zkeysPath) {
46
+ const files = await (0, glob_1.glob)("**/*.r1cs", { cwd: zkeysPath });
47
+ const circuitsConfigPath = path_1.default.resolve(__dirname, "..", "circom", "circuits.json");
48
+ const circuitsConfig = JSON.parse(await fs_1.default.promises.readFile(circuitsConfigPath, "utf-8"));
49
+ const params = files
50
+ .map((file) => ({ config: circuitsConfig[file.split("/")[0]], file }))
51
+ .reduce((acc, { config, file }) => {
52
+ acc[file] = `${config.template} [${config.params?.toString()}]`;
53
+ return acc;
54
+ }, {});
55
+ const { promisify } = await Promise.resolve().then(() => __importStar(require("util")));
56
+ const execFile = promisify(child_process_1.default.execFile);
57
+ const data = [];
58
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
59
+ for (let index = 0; index < files.length; index += 1) {
60
+ // eslint-disable-next-line no-await-in-loop
61
+ const result = await execFile("snarkjs", ["r1cs", "info", path_1.default.resolve(zkeysPath, files[index])]);
62
+ data.push(result);
63
+ }
64
+ // eslint-disable-next-line no-console
65
+ console.log(data.map(({ stdout }, index) => `${files[index]}\n${params[files[index]]}\n${stdout}`).join("\n"));
66
+ }
67
+ if (require.main === module) {
68
+ (async () => {
69
+ await info(process.argv[process.argv.indexOf("--zkeys") + 1]);
70
+ })();
71
+ }
72
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../ts/info.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,oBA+BC;AAxCD,6DAA6D;AAC7D,+BAA4B;AAE5B,kEAAyC;AACzC,4CAAoB;AACpB,gDAAwB;AAIjB,KAAK,UAAU,IAAI,CAAC,SAAiB;IAC1C,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,WAAW,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAE1D,MAAM,kBAAkB,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACpF,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAGxF,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK;SACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;SACrE,MAAM,CAAyB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACxD,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC;QAEhE,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAET,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,uBAAY,CAAC,QAAQ,CAAC,CAAC;IAElD,MAAM,IAAI,GAAyC,EAAE,CAAC;IAEtD,4DAA4D;IAC5D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,4CAA4C;QAC5C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,104 @@
1
+ import type { CircuitConfig } from "circomkit";
2
+ export type BigNumberish = number | string | bigint;
3
+ /**
4
+ * Interface that represents Verification key
5
+ */
6
+ export interface ISnarkJSVerificationKey {
7
+ protocol: BigNumberish;
8
+ curve: BigNumberish;
9
+ nPublic: BigNumberish;
10
+ vk_alpha_1: BigNumberish[];
11
+ vk_beta_2: BigNumberish[][];
12
+ vk_gamma_2: BigNumberish[][];
13
+ vk_delta_2: BigNumberish[][];
14
+ vk_alphabeta_12: BigNumberish[][][];
15
+ IC: BigNumberish[][];
16
+ }
17
+ /**
18
+ * Inputs for circuit PollJoining
19
+ */
20
+ export interface IPollJoiningInputs {
21
+ privKey: bigint;
22
+ pollPubKey: bigint[][];
23
+ stateLeaf: bigint[];
24
+ siblings: bigint[][];
25
+ indices: bigint[];
26
+ nullifier: bigint;
27
+ credits: bigint;
28
+ stateRoot: bigint;
29
+ actualStateTreeDepth: bigint;
30
+ pollId: bigint;
31
+ }
32
+ /**
33
+ * Inputs for circuit PollJoined
34
+ */
35
+ export interface IPollJoinedInputs {
36
+ privKey: bigint;
37
+ voiceCreditsBalance: bigint;
38
+ stateLeaf: bigint[];
39
+ pathElements: bigint[][];
40
+ pathIndices: bigint[];
41
+ credits: bigint;
42
+ stateRoot: bigint;
43
+ actualStateTreeDepth: bigint;
44
+ }
45
+ /**
46
+ * Inputs for circuit ProcessMessages
47
+ */
48
+ export interface IProcessMessagesInputs {
49
+ actualStateTreeDepth: bigint;
50
+ numSignUps: bigint;
51
+ batchEndIndex: bigint;
52
+ index: bigint;
53
+ inputBatchHash: bigint;
54
+ outputBatchHash: bigint;
55
+ msgs: bigint[];
56
+ coordPrivKey: bigint;
57
+ coordinatorPublicKeyHash: bigint;
58
+ encPubKeys: bigint[];
59
+ currentStateRoot: bigint;
60
+ currentStateLeaves: bigint[];
61
+ currentStateLeavesPathElements: bigint[][];
62
+ currentSbCommitment: bigint;
63
+ currentSbSalt: bigint;
64
+ newSbCommitment: bigint;
65
+ newSbSalt: bigint;
66
+ currentBallotRoot: bigint;
67
+ currentBallots: bigint[];
68
+ currentBallotsPathElements: bigint[][];
69
+ currentVoteWeights: bigint[];
70
+ currentVoteWeightsPathElements: bigint[][];
71
+ voteOptions: bigint;
72
+ }
73
+ /**
74
+ * Inputs for circuit TallyVotes
75
+ */
76
+ export interface ITallyVotesInputs {
77
+ stateRoot: bigint;
78
+ ballotRoot: bigint;
79
+ sbSalt: bigint;
80
+ index: bigint;
81
+ numSignUps: bigint;
82
+ sbCommitment: bigint;
83
+ currentTallyCommitment: bigint;
84
+ newTallyCommitment: bigint;
85
+ ballots: bigint[];
86
+ ballotPathElements: bigint[];
87
+ votes: bigint[][];
88
+ currentResults: bigint[];
89
+ currentResultsRootSalt: bigint;
90
+ currentSpentVoiceCreditSubtotal: bigint;
91
+ currentSpentVoiceCreditSubtotalSalt: bigint;
92
+ currentPerVOSpentVoiceCredits: bigint[];
93
+ currentPerVOSpentVoiceCreditsRootSalt: bigint;
94
+ newResultsRootSalt: bigint;
95
+ newPerVOSpentVoiceCreditsRootSalt: bigint;
96
+ newSpentVoiceCreditSubtotalSalt: bigint;
97
+ }
98
+ /**
99
+ * Extend CircuitConfig type to include the name of the circuit
100
+ */
101
+ export interface CircuitConfigWithName extends CircuitConfig {
102
+ name: string;
103
+ }
104
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../ts/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../ts/types.ts"],"names":[],"mappings":""}