@solarity/zkit 0.1.0

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 (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -0
  3. package/dist/config/config.d.ts +24 -0
  4. package/dist/config/config.d.ts.map +1 -0
  5. package/dist/config/config.js +17 -0
  6. package/dist/config/config.js.map +1 -0
  7. package/dist/core/CircomZKit.d.ts +39 -0
  8. package/dist/core/CircomZKit.d.ts.map +1 -0
  9. package/dist/core/CircomZKit.js +94 -0
  10. package/dist/core/CircomZKit.js.map +1 -0
  11. package/dist/core/CircuitZKit.d.ts +146 -0
  12. package/dist/core/CircuitZKit.d.ts.map +1 -0
  13. package/dist/core/CircuitZKit.js +342 -0
  14. package/dist/core/CircuitZKit.js.map +1 -0
  15. package/dist/core/ManagerZKit.d.ts +97 -0
  16. package/dist/core/ManagerZKit.d.ts.map +1 -0
  17. package/dist/core/ManagerZKit.js +222 -0
  18. package/dist/core/ManagerZKit.js.map +1 -0
  19. package/dist/core/templates/verifier_groth16.sol.ejs +164 -0
  20. package/dist/index.d.ts +6 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +24 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/types/types.d.ts +46 -0
  25. package/dist/types/types.d.ts.map +1 -0
  26. package/dist/types/types.js +3 -0
  27. package/dist/types/types.js.map +1 -0
  28. package/dist/utils/utils.d.ts +18 -0
  29. package/dist/utils/utils.d.ts.map +1 -0
  30. package/dist/utils/utils.js +58 -0
  31. package/dist/utils/utils.js.map +1 -0
  32. package/package.json +51 -0
  33. package/src/config/config.ts +37 -0
  34. package/src/core/CircomZKit.ts +110 -0
  35. package/src/core/CircuitZKit.ts +375 -0
  36. package/src/core/ManagerZKit.ts +231 -0
  37. package/src/core/templates/verifier_groth16.sol.ejs +164 -0
  38. package/src/index.ts +7 -0
  39. package/src/types/types.ts +43 -0
  40. package/src/utils/utils.ts +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManagerZKit.js","sourceRoot":"","sources":["../../src/core/ManagerZKit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.7.0 <0.9.0;
3
+
4
+ contract <%=verifier_id%> {
5
+ /// @dev Base field size
6
+ uint256 public constant BASE_FIELD_SIZE =
7
+ 21888242871839275222246405745257275088696311157297823662689037894645226208583;
8
+
9
+ /// @dev Verification Key data
10
+ uint256 public constant ALPHA_X =
11
+ <%=vk_alpha_1[0]%>;
12
+ uint256 public constant ALPHA_Y =
13
+ <%=vk_alpha_1[1]%>;
14
+ uint256 public constant BETA_X1 =
15
+ <%=vk_beta_2[0][1]%>;
16
+ uint256 public constant BETA_X2 =
17
+ <%=vk_beta_2[0][0]%>;
18
+ uint256 public constant BETA_Y1 =
19
+ <%=vk_beta_2[1][1]%>;
20
+ uint256 public constant BETA_Y2 =
21
+ <%=vk_beta_2[1][0]%>;
22
+ uint256 public constant GAMMA_X1 =
23
+ <%=vk_gamma_2[0][1]%>;
24
+ uint256 public constant GAMMA_X2 =
25
+ <%=vk_gamma_2[0][0]%>;
26
+ uint256 public constant GAMMA_Y1 =
27
+ <%=vk_gamma_2[1][1]%>;
28
+ uint256 public constant GAMMA_Y2 =
29
+ <%=vk_gamma_2[1][0]%>;
30
+ uint256 public constant DELTA_X1 =
31
+ <%=vk_delta_2[0][1]%>;
32
+ uint256 public constant DELTA_X2 =
33
+ <%=vk_delta_2[0][0]%>;
34
+ uint256 public constant DELTA_Y1 =
35
+ <%=vk_delta_2[1][1]%>;
36
+ uint256 public constant DELTA_Y2 =
37
+ <%=vk_delta_2[1][0] -%>;
38
+
39
+ <% for (let i=0; i<IC.length; i++) { %>uint256 public constant IC<%=i%>_X =
40
+ <%=IC[i][0]%>;
41
+ uint256 public constant IC<%=i%>_Y =
42
+ <%=IC[i][1]%>;
43
+ <% } -%>
44
+
45
+ /// @dev Memory data
46
+ uint16 public constant P_VK = 0;
47
+ uint16 public constant P_PAIRING = 128;
48
+ uint16 public constant P_LAST_MEM = 896;
49
+
50
+ function verifyProof(
51
+ uint256[2] calldata pA_,
52
+ uint256[2][2] calldata pB_,
53
+ uint256[2] calldata pC_,
54
+ uint256[<%=IC.length-1%>] calldata pubSignals_
55
+ ) public view returns (bool) {
56
+ assembly {
57
+ function checkField(v) {
58
+ if iszero(lt(v, BASE_FIELD_SIZE)) {
59
+ mstore(0, 0)
60
+ return(0, 0x20)
61
+ }
62
+ }
63
+
64
+ /// @dev G1 function to multiply a G1 value(x,y) to value in an address
65
+ function g1MulAccC(pR, x, y, s) {
66
+ let success
67
+ let mIn := mload(0x40)
68
+
69
+ mstore(mIn, x)
70
+ mstore(add(mIn, 32), y)
71
+ mstore(add(mIn, 64), s)
72
+
73
+ success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
74
+
75
+ if iszero(success) {
76
+ mstore(0, 0)
77
+ return(0, 0x20)
78
+ }
79
+
80
+ mstore(add(mIn, 64), mload(pR))
81
+ mstore(add(mIn, 96), mload(add(pR, 32)))
82
+
83
+ success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
84
+
85
+ if iszero(success) {
86
+ mstore(0, 0)
87
+ return(0, 0x20)
88
+ }
89
+ }
90
+
91
+ function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {
92
+ let pPairing_ := add(pMem, P_PAIRING)
93
+ let pVk_ := add(pMem, P_VK)
94
+
95
+ mstore(pVk_, IC0_X)
96
+ mstore(add(pVk_, 32), IC0_Y)
97
+
98
+ /// @dev Compute the linear combination vk_x
99
+ <% for (let i = 1; i <= nPublic; i++) { %>g1MulAccC(pVk_, IC<%=i%>_X, IC<%=i%>_Y, calldataload(add(pubSignals, <%=(i-1)*32%>)))
100
+ <% } -%>
101
+
102
+ /// @dev -A
103
+ mstore(pPairing_, calldataload(pA))
104
+ mstore(
105
+ add(pPairing_, 32),
106
+ mod(sub(BASE_FIELD_SIZE, calldataload(add(pA, 32))), BASE_FIELD_SIZE)
107
+ )
108
+
109
+ /// @dev B
110
+ mstore(add(pPairing_, 64), calldataload(pB))
111
+ mstore(add(pPairing_, 96), calldataload(add(pB, 32)))
112
+ mstore(add(pPairing_, 128), calldataload(add(pB, 64)))
113
+ mstore(add(pPairing_, 160), calldataload(add(pB, 96)))
114
+
115
+ /// @dev alpha1
116
+ mstore(add(pPairing_, 192), ALPHA_X)
117
+ mstore(add(pPairing_, 224), ALPHA_Y)
118
+
119
+ /// @dev beta2
120
+ mstore(add(pPairing_, 256), BETA_X1)
121
+ mstore(add(pPairing_, 288), BETA_X2)
122
+ mstore(add(pPairing_, 320), BETA_Y1)
123
+ mstore(add(pPairing_, 352), BETA_Y2)
124
+
125
+ /// @dev vk_x
126
+ mstore(add(pPairing_, 384), mload(add(pMem, P_VK)))
127
+ mstore(add(pPairing_, 416), mload(add(pMem, add(P_VK, 32))))
128
+
129
+ /// @dev gamma2
130
+ mstore(add(pPairing_, 448), GAMMA_X1)
131
+ mstore(add(pPairing_, 480), GAMMA_X2)
132
+ mstore(add(pPairing_, 512), GAMMA_Y1)
133
+ mstore(add(pPairing_, 544), GAMMA_Y2)
134
+
135
+ /// @dev C
136
+ mstore(add(pPairing_, 576), calldataload(pC))
137
+ mstore(add(pPairing_, 608), calldataload(add(pC, 32)))
138
+
139
+ /// @dev delta2
140
+ mstore(add(pPairing_, 640), DELTA_X1)
141
+ mstore(add(pPairing_, 672), DELTA_X2)
142
+ mstore(add(pPairing_, 704), DELTA_Y1)
143
+ mstore(add(pPairing_, 736), DELTA_Y2)
144
+
145
+ let success_ := staticcall(sub(gas(), 2000), 8, pPairing_, 768, pPairing_, 0x20)
146
+
147
+ isOk := and(success_, mload(pPairing_))
148
+ }
149
+
150
+ let pMem_ := mload(0x40)
151
+ mstore(0x40, add(pMem_, P_LAST_MEM))
152
+
153
+ /// @dev Validate that all evaluations ∈ F
154
+ <% for (let i = 0; i < IC.length; i++) { %>checkField(calldataload(add(pubSignals_, <%=i*32%>)))
155
+ <% } -%>
156
+
157
+ /// @dev Validate all evaluations
158
+ let isValid := checkPairing(pA_, pB_, pC_, pubSignals_, pMem_)
159
+
160
+ mstore(0, isValid)
161
+ return(0, 0x20)
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,6 @@
1
+ export * from "./core/CircomZKit";
2
+ export * from "./core/CircuitZKit";
3
+ export * from "./core/ManagerZKit";
4
+ export { NumericString, PublicSignals, Groth16Proof, Calldata, ProofStruct, Inputs, CircuitInfo } from "./types/types";
5
+ export { CompileOptions, ManagerZKitConfig, defaultCompileOptions, defaultManagerOptions } from "./config/config";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.defaultManagerOptions = exports.defaultCompileOptions = void 0;
18
+ __exportStar(require("./core/CircomZKit"), exports);
19
+ __exportStar(require("./core/CircuitZKit"), exports);
20
+ __exportStar(require("./core/ManagerZKit"), exports);
21
+ var config_1 = require("./config/config");
22
+ Object.defineProperty(exports, "defaultCompileOptions", { enumerable: true, get: function () { return config_1.defaultCompileOptions; } });
23
+ Object.defineProperty(exports, "defaultManagerOptions", { enumerable: true, get: function () { return config_1.defaultManagerOptions; } });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,qDAAmC;AACnC,qDAAmC;AAInC,0CAAkH;AAAtE,+GAAA,qBAAqB,OAAA;AAAE,+GAAA,qBAAqB,OAAA"}
@@ -0,0 +1,46 @@
1
+ export type NumericString = `${number}` | string;
2
+ export type PublicSignals = NumericString[];
3
+ export type Groth16Proof = {
4
+ pi_a: [NumericString, NumericString];
5
+ pi_b: [[NumericString, NumericString], [NumericString, NumericString]];
6
+ pi_c: [NumericString, NumericString];
7
+ protocol: string;
8
+ curve: string;
9
+ };
10
+ export type Calldata = [
11
+ [
12
+ NumericString,
13
+ NumericString
14
+ ],
15
+ [
16
+ [NumericString, NumericString],
17
+ [NumericString, NumericString]
18
+ ],
19
+ [
20
+ NumericString,
21
+ NumericString
22
+ ],
23
+ [
24
+ NumericString
25
+ ]
26
+ ];
27
+ export type ProofStruct = {
28
+ proof: Groth16Proof;
29
+ publicSignals: PublicSignals;
30
+ };
31
+ export type NumberLike = number | bigint | string;
32
+ export type ArrayLike = NumberLike[] | ArrayLike[];
33
+ export type InputLike = NumberLike | ArrayLike;
34
+ export type Inputs = Record<string, InputLike>;
35
+ export type CircuitInfo = {
36
+ path: string;
37
+ id: string | null;
38
+ };
39
+ export type FileType = "r1cs" | "zkey" | "vkey" | "sym" | "json" | "wasm" | "sol";
40
+ export type DirType = "circuit" | "artifact" | "verifier";
41
+ export type TemplateType = "groth16";
42
+ export type PtauInfo = {
43
+ file: string;
44
+ url: string | null;
45
+ };
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB;QAAC,aAAa;QAAE,aAAa;KAAC;IAC9B;QAAC,CAAC,aAAa,EAAE,aAAa,CAAC;QAAE,CAAC,aAAa,EAAE,aAAa,CAAC;KAAC;IAChE;QAAC,aAAa;QAAE,aAAa;KAAC;IAC9B;QAAC,aAAa;KAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,SAAS,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;AACnD,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAClF,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC"}
@@ -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":["../../src/types/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Reads a directory recursively and calls the callback for each file.
3
+ *
4
+ * @dev After Node.js 20.0.0 the `recursive` option is available.
5
+ *
6
+ * @param {string} dir - The directory to read.
7
+ * @param {(dir: string, file: string) => void} callback - The callback function.
8
+ */
9
+ export declare function readDirRecursively(dir: string, callback: (dir: string, file: string) => void): void;
10
+ /**
11
+ * Downloads a file from the specified URL.
12
+ *
13
+ * @param {string} file - The path to save the file to.
14
+ * @param {string} url - The URL to download the file from.
15
+ * @returns {Promise<boolean>} Whether the file was downloaded successfully.
16
+ */
17
+ export declare function downloadFile(file: string, url: string): Promise<boolean>;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAkBnG;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB9E"}
@@ -0,0 +1,58 @@
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.downloadFile = exports.readDirRecursively = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const https_1 = __importDefault(require("https"));
10
+ /**
11
+ * Reads a directory recursively and calls the callback for each file.
12
+ *
13
+ * @dev After Node.js 20.0.0 the `recursive` option is available.
14
+ *
15
+ * @param {string} dir - The directory to read.
16
+ * @param {(dir: string, file: string) => void} callback - The callback function.
17
+ */
18
+ function readDirRecursively(dir, callback) {
19
+ if (!fs_1.default.existsSync(dir)) {
20
+ return;
21
+ }
22
+ const entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
23
+ for (const entry of entries) {
24
+ const entryPath = path_1.default.join(dir, entry.name);
25
+ if (entry.isDirectory()) {
26
+ readDirRecursively(entryPath, callback);
27
+ }
28
+ if (entry.isFile()) {
29
+ callback(dir, entryPath);
30
+ }
31
+ }
32
+ }
33
+ exports.readDirRecursively = readDirRecursively;
34
+ /**
35
+ * Downloads a file from the specified URL.
36
+ *
37
+ * @param {string} file - The path to save the file to.
38
+ * @param {string} url - The URL to download the file from.
39
+ * @returns {Promise<boolean>} Whether the file was downloaded successfully.
40
+ */
41
+ async function downloadFile(file, url) {
42
+ const fileStream = fs_1.default.createWriteStream(file);
43
+ return new Promise((resolve, reject) => {
44
+ const request = https_1.default.get(url, (response) => {
45
+ response.pipe(fileStream);
46
+ });
47
+ fileStream.on("finish", () => resolve(true));
48
+ request.on("error", (err) => {
49
+ fs_1.default.unlink(file, () => reject(err));
50
+ });
51
+ fileStream.on("error", (err) => {
52
+ fs_1.default.unlink(file, () => reject(err));
53
+ });
54
+ request.end();
55
+ });
56
+ }
57
+ exports.downloadFile = downloadFile;
58
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAE1B;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,QAA6C;IAC3F,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAlBD,gDAkBC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IAC1D,MAAM,UAAU,GAAG,YAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC1C,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE7C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,YAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7B,YAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AApBD,oCAoBC"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@solarity/zkit",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "author": "Distributed Lab",
6
+ "readme": "README.md",
7
+ "description": "Circom zero knowledge kit",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/dl-solarity/zkit.git"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "src",
15
+ "LICENSE",
16
+ "README.md"
17
+ ],
18
+ "keywords": [
19
+ "solarity",
20
+ "circom",
21
+ "kit",
22
+ "zkp"
23
+ ],
24
+ "main": "dist/index.js",
25
+ "types": "dist/index.d.ts",
26
+ "scripts": {
27
+ "prepare": "husky",
28
+ "build": "tsc",
29
+ "test": "jest --forceExit",
30
+ "lint-fix": "prettier --write 'src/**/*.ts'",
31
+ "publish-to-npm": "npm run lint-fix && bash ./scripts/publish.sh"
32
+ },
33
+ "dependencies": {
34
+ "@distributedlab/circom2": "0.2.18-rc.2",
35
+ "ejs": "3.1.10",
36
+ "snarkjs": "0.7.3",
37
+ "uuid": "9.0.1"
38
+ },
39
+ "devDependencies": {
40
+ "@types/ejs": "^3.1.5",
41
+ "@types/jest": "^29.5.12",
42
+ "@types/snarkjs": "^0.7.8",
43
+ "@types/uuid": "^9.0.8",
44
+ "husky": "^9.0.11",
45
+ "jest": "^29.7.0",
46
+ "prettier": "^3.2.5",
47
+ "ts-jest": "^29.1.2",
48
+ "ts-node": "^10.9.2",
49
+ "typescript": "^5.4.5"
50
+ }
51
+ }
@@ -0,0 +1,37 @@
1
+ const { Context } = require("@distributedlab/circom2");
2
+
3
+ export type ManagerZKitConfig = {
4
+ circuitsDir: string;
5
+ artifactsDir: string;
6
+ verifiersDir: string;
7
+ ptauDir: string;
8
+ allowDownload: boolean;
9
+ };
10
+
11
+ export const defaultManagerOptions: Partial<ManagerZKitConfig> = {
12
+ circuitsDir: "circuits",
13
+ artifactsDir: "zkit-artifacts",
14
+ verifiersDir: "contracts/verifiers",
15
+ allowDownload: true,
16
+ };
17
+
18
+ export type CompileOptions = {
19
+ sym: boolean;
20
+ json: boolean;
21
+ c: boolean;
22
+ quiet: boolean;
23
+ };
24
+
25
+ export const defaultCompileOptions: CompileOptions = {
26
+ sym: false,
27
+ json: false,
28
+ c: false,
29
+ quiet: false,
30
+ };
31
+
32
+ export type ManagerZKitPrivateConfig = ManagerZKitConfig & {
33
+ compiler: typeof Context;
34
+ templates: {
35
+ groth16: string;
36
+ };
37
+ };
@@ -0,0 +1,110 @@
1
+ import os from "os";
2
+ import path from "path";
3
+
4
+ import { CircuitZKit } from "./CircuitZKit";
5
+ import { ManagerZKit } from "./ManagerZKit";
6
+ import { CircuitInfo } from "../types/types";
7
+ import { readDirRecursively } from "../utils/utils";
8
+ import { defaultManagerOptions, ManagerZKitConfig } from "../config/config";
9
+
10
+ /**
11
+ * `CircomZKit` acts as a factory for `CircuitZKit` instances.
12
+ */
13
+ export class CircomZKit {
14
+ private readonly _manager: ManagerZKit;
15
+
16
+ /**
17
+ * Creates a new `CircomZKit` instance.
18
+ *
19
+ * @param {Partial<ManagerZKitConfig>} [options=defaultManagerOptions] - The configuration options to use.
20
+ */
21
+ constructor(options: Partial<ManagerZKitConfig> = defaultManagerOptions) {
22
+ this._manager = new ManagerZKit({ ...defaultManagerOptions, ...options });
23
+ }
24
+
25
+ /**
26
+ * Returns a `CircuitZKit` instance for the specified circuit.
27
+ *
28
+ * @dev If the circuit id is not unique, the path to the circuit file must be provided.
29
+ *
30
+ * @param {string} circuit - The path to the circuit file or the circuit id (filename without extension).
31
+ * @returns {CircomZKit} The `CircuitZKit` instance.
32
+ */
33
+ public getCircuit(circuit: string): CircuitZKit {
34
+ const circuits = this._getAllCircuits();
35
+
36
+ const candidates = circuits.filter((file) => {
37
+ if (circuit.endsWith(".circom")) {
38
+ return file == path.normalize(circuit);
39
+ }
40
+
41
+ return path.basename(file) == `${circuit}.circom`;
42
+ });
43
+
44
+ if (candidates.length == 0) {
45
+ throw Error(`No circuits with name \"${circuit}\" found`);
46
+ }
47
+
48
+ if (candidates.length > 1) {
49
+ throw Error(
50
+ `Found multiple entries for the circuit "${circuit}".
51
+
52
+ \rConsider replacing \"${circuit}\" with one of the valid paths:
53
+ \r${candidates.map((candidate) => `"${candidate}"`).join(os.EOL)}`,
54
+ );
55
+ }
56
+
57
+ return new CircuitZKit(path.join(this._manager.getCircuitsDir(), candidates[0]), this._manager);
58
+ }
59
+
60
+ /**
61
+ * Returns an array of all circuits available in the circuits directory.
62
+ *
63
+ * @dev If a circuit id is not unique, the id will be set to `null`.
64
+ *
65
+ * @returns {CircuitInfo[]} An array of circuit information objects.
66
+ */
67
+ public getCircuits(): CircuitInfo[] {
68
+ const circuits = this._getAllCircuits();
69
+
70
+ let circuitsCount = {} as Record<string, number>;
71
+
72
+ for (const circuit of circuits) {
73
+ const circuitId = path.parse(circuit).name;
74
+
75
+ circuitsCount[circuitId] = (circuitsCount[circuitId] || 0) + 1;
76
+ }
77
+
78
+ let result = [] as CircuitInfo[];
79
+
80
+ for (const circuit of circuits) {
81
+ const circuitId = path.parse(circuit).name;
82
+
83
+ result.push({
84
+ path: circuit,
85
+ id: circuitsCount[circuitId] > 1 ? null : circuitId,
86
+ });
87
+ }
88
+
89
+ return result;
90
+ }
91
+
92
+ /**
93
+ * Returns an array of all circuits paths available in the circuits directory.
94
+ *
95
+ * @returns {string[]} An array of circuit paths.
96
+ */
97
+ private _getAllCircuits(): string[] {
98
+ const circuitsDir = this._manager.getCircuitsDir();
99
+
100
+ let circuits = [] as string[];
101
+
102
+ readDirRecursively(circuitsDir, (_dir: string, file: string) => {
103
+ if (path.extname(file) == ".circom") {
104
+ circuits.push(path.relative(circuitsDir, file));
105
+ }
106
+ });
107
+
108
+ return circuits;
109
+ }
110
+ }