From 96403b7e92a79875ca47d8a900cc2e8b9eddbb04 Mon Sep 17 00:00:00 2001 From: cedoor Date: Tue, 5 Dec 2023 19:41:36 +0000 Subject: [PATCH] feat(circuits): update semaphore circuits re #357 --- .prettierignore | 5 +- jest.config.ts | 3 + package.json | 1 + packages/circuits/.gitignore | 3 + packages/circuits/.mocharc.json | 7 + packages/circuits/LICENSE | 21 ++ packages/circuits/README.md | 10 +- packages/circuits/circomkit.json | 17 + packages/circuits/circuits.json | 7 + packages/circuits/package.json | 37 +- packages/circuits/scheme.png | Bin 15604 -> 0 bytes packages/circuits/semaphore.circom | 99 +----- packages/circuits/tests/common.ts | 12 + packages/circuits/tests/semaphore.test.ts | 72 ++++ packages/circuits/tree.circom | 40 --- yarn.lock | 403 +++++++++++++++++++++- 16 files changed, 591 insertions(+), 146 deletions(-) create mode 100644 packages/circuits/.gitignore create mode 100644 packages/circuits/.mocharc.json create mode 100644 packages/circuits/LICENSE create mode 100644 packages/circuits/circomkit.json create mode 100644 packages/circuits/circuits.json delete mode 100644 packages/circuits/scheme.png create mode 100644 packages/circuits/tests/common.ts create mode 100644 packages/circuits/tests/semaphore.test.ts delete mode 100644 packages/circuits/tree.circom diff --git a/.prettierignore b/.prettierignore index 7d9431b3d..a8c276c88 100644 --- a/.prettierignore +++ b/.prettierignore @@ -16,9 +16,6 @@ packages/contracts/deployed-contracts/undefined.json packages/contracts/deployed-contracts/hardhat.json packages/contracts/deployed-contracts/localhost.json -# circuits -circuits - # contracts Verifier*.sol @@ -44,4 +41,4 @@ snark-artifacts # Next.js .next/ -public \ No newline at end of file +public diff --git a/jest.config.ts b/jest.config.ts index f85f06e01..780469935 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,9 +1,12 @@ import fs from "fs" import type { Config } from "@jest/types" +const exclude = ["circuits", "contracts"] + const projects: any = fs .readdirSync("./packages", { withFileTypes: true }) .filter((directory) => directory.isDirectory()) + .filter((directory) => !exclude.includes(directory.name)) .map(({ name }) => ({ rootDir: `packages/${name}`, displayName: name, diff --git a/package.json b/package.json index 5a00d6339..310742755 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "test": "yarn test:libraries && yarn test:contracts", "test:libraries": "jest --coverage", "test:contracts": "yarn workspace contracts test:coverage", + "test:circuits": "yarn workspace @semaphore-protocol/circuits test", "lint": "eslint . --ext .js,.ts && yarn workspace contracts lint", "prettier": "prettier -c .", "prettier:write": "prettier -w .", diff --git a/packages/circuits/.gitignore b/packages/circuits/.gitignore new file mode 100644 index 000000000..317889d51 --- /dev/null +++ b/packages/circuits/.gitignore @@ -0,0 +1,3 @@ +ptau +main +test diff --git a/packages/circuits/.mocharc.json b/packages/circuits/.mocharc.json new file mode 100644 index 000000000..0319b9322 --- /dev/null +++ b/packages/circuits/.mocharc.json @@ -0,0 +1,7 @@ +{ + "extension": ["ts"], + "require": "ts-node/register", + "spec": "./tests/*.test.ts", + "timeout": 100000, + "exit": true +} diff --git a/packages/circuits/LICENSE b/packages/circuits/LICENSE new file mode 100644 index 000000000..4377091ec --- /dev/null +++ b/packages/circuits/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Ethereum Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/circuits/README.md b/packages/circuits/README.md index 6cd3186f6..a1729bfec 100644 --- a/packages/circuits/README.md +++ b/packages/circuits/README.md @@ -9,8 +9,14 @@ - - Github license + + NPM license + + + NPM version + + + Downloads

diff --git a/packages/circuits/circomkit.json b/packages/circuits/circomkit.json new file mode 100644 index 000000000..2e1f9fb9c --- /dev/null +++ b/packages/circuits/circomkit.json @@ -0,0 +1,17 @@ +{ + "protocol": "groth16", + "prime": "bn128", + "version": "2.1.5", + "circuits": "./circuits.json", + "dirPtau": "./ptau", + "dirCircuits": "./", + "dirInputs": "./inputs", + "dirBuild": "./build", + "optimization": 1, + "inspect": true, + "include": ["../../node_modules/circomlib/circuits", "../../node_modules/@zk-kit/circuits/circom"], + "groth16numContributions": 1, + "groth16askForEntropy": false, + "logLevel": "INFO", + "verbose": true +} diff --git a/packages/circuits/circuits.json b/packages/circuits/circuits.json new file mode 100644 index 000000000..f48abb59d --- /dev/null +++ b/packages/circuits/circuits.json @@ -0,0 +1,7 @@ +{ + "semaphore": { + "file": "semaphore", + "template": "Semaphore", + "params": [4] + } +} diff --git a/packages/circuits/package.json b/packages/circuits/package.json index e015df878..ba6408128 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -1,7 +1,38 @@ { - "name": "circuits", - "private": true, + "name": "@semaphore-protocol/circuits", + "version": "3.15.1", + "description": "Semaphore Circom circuits to generate zero-knowledge proofs.", + "license": "MIT", + "files": [ + "**/*.circom", + "!main", + "!test", + "LICENSE", + "README.md" + ], + "repository": "https://github.com/semaphore-protocol/semaphore", + "homepage": "https://github.com/semaphore-protocol/semaphore/tree/main/packages/data", + "bugs": { + "url": "https://github.com/semaphore-protocol/semaphore.git/issues" + }, + "scripts": { + "compile": "circomkit compile semaphore", + "setup": "circomkit setup semaphore", + "test": "mocha" + }, + "publishConfig": { + "access": "public" + }, "dependencies": { - "circomlib": "^2.0.2" + "@zk-kit/circuits": "0.2.3", + "circomlib": "2.0.5" + }, + "devDependencies": { + "@types/mocha": "^10.0.6", + "@zk-kit/eddsa-poseidon": "0.3.1", + "@zk-kit/imt": "^2.0.0-beta", + "circomkit": "^0.0.19", + "mocha": "^10.2.0", + "poseidon-lite": "^0.2.0" } } diff --git a/packages/circuits/scheme.png b/packages/circuits/scheme.png deleted file mode 100644 index 78c2c705a5405293851d95ea18173c184273acf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15604 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 Qr~q>6gv;?VJHH$M3Cr8WX#fBK diff --git a/packages/circuits/semaphore.circom b/packages/circuits/semaphore.circom index 3b6845709..b0637268f 100644 --- a/packages/circuits/semaphore.circom +++ b/packages/circuits/semaphore.circom @@ -1,90 +1,25 @@ -pragma circom 2.0.0; +pragma circom 2.1.5; -include "../node_modules/circomlib/circuits/poseidon.circom"; -include "./tree.circom"; +include "babyjub.circom"; +include "poseidon.circom"; +include "binary-merkle-root.circom"; -template CalculateSecret() { - signal input identityNullifier; - signal input identityTrapdoor; +template Semaphore(MAX_DEPTH) { + signal input privateKey; + signal input treeDepth, treeIndices[MAX_DEPTH], treeSiblings[MAX_DEPTH]; + signal input message; + signal input scope; - signal output out; + signal output treeRoot, nullifier; - component poseidon = Poseidon(2); + var Ax, Ay; + (Ax, Ay) = BabyPbk()(privateKey); - poseidon.inputs[0] <== identityNullifier; - poseidon.inputs[1] <== identityTrapdoor; + var treeLeaf = Poseidon(2)([Ax, Ay]); - out <== poseidon.out; -} - -template CalculateIdentityCommitment() { - signal input secret; - - signal output out; - - component poseidon = Poseidon(1); + treeRoot <== BinaryMerkleRoot(MAX_DEPTH)(treeLeaf, treeDepth, treeIndices, treeSiblings); + nullifier <== Poseidon(2)([scope, privateKey]); - poseidon.inputs[0] <== secret; - - out <== poseidon.out; + // Dummy constraint to prevent compiler from optimizing it. + signal dummySquare <== message * message; } - -template CalculateNullifierHash() { - signal input externalNullifier; - signal input identityNullifier; - - signal output out; - - component poseidon = Poseidon(2); - - poseidon.inputs[0] <== externalNullifier; - poseidon.inputs[1] <== identityNullifier; - - out <== poseidon.out; -} - -// The current Semaphore smart contracts require nLevels <= 32 and nLevels >= 16. -template Semaphore(nLevels) { - signal input identityNullifier; - signal input identityTrapdoor; - signal input treePathIndices[nLevels]; - signal input treeSiblings[nLevels]; - - signal input signalHash; - signal input externalNullifier; - - signal output root; - signal output nullifierHash; - - component calculateSecret = CalculateSecret(); - calculateSecret.identityNullifier <== identityNullifier; - calculateSecret.identityTrapdoor <== identityTrapdoor; - - signal secret; - secret <== calculateSecret.out; - - component calculateIdentityCommitment = CalculateIdentityCommitment(); - calculateIdentityCommitment.secret <== secret; - - component calculateNullifierHash = CalculateNullifierHash(); - calculateNullifierHash.externalNullifier <== externalNullifier; - calculateNullifierHash.identityNullifier <== identityNullifier; - - component inclusionProof = MerkleTreeInclusionProof(nLevels); - inclusionProof.leaf <== calculateIdentityCommitment.out; - - for (var i = 0; i < nLevels; i++) { - inclusionProof.siblings[i] <== treeSiblings[i]; - inclusionProof.pathIndices[i] <== treePathIndices[i]; - } - - root <== inclusionProof.root; - - // Dummy square to prevent tampering signalHash. - signal signalHashSquared; - signalHashSquared <== signalHash * signalHash; - - nullifierHash <== calculateNullifierHash.out; -} - -component main {public [signalHash, externalNullifier]} = Semaphore(20); diff --git a/packages/circuits/tests/common.ts b/packages/circuits/tests/common.ts new file mode 100644 index 000000000..20f153fce --- /dev/null +++ b/packages/circuits/tests/common.ts @@ -0,0 +1,12 @@ +import { Circomkit } from "circomkit" +import { readFileSync } from "fs" +import path from "path" + +const configFilePath = path.join(__dirname, "../circomkit.json") +const config = JSON.parse(readFileSync(configFilePath, "utf-8")) + +// eslint-disable-next-line import/prefer-default-export +export const circomkit = new Circomkit({ + ...config, + verbose: false +}) diff --git a/packages/circuits/tests/semaphore.test.ts b/packages/circuits/tests/semaphore.test.ts new file mode 100644 index 000000000..dee201d55 --- /dev/null +++ b/packages/circuits/tests/semaphore.test.ts @@ -0,0 +1,72 @@ +import { derivePublicKey, deriveSecretScalar } from "@zk-kit/eddsa-poseidon" +import { LeanIMT } from "@zk-kit/imt" +import { WitnessTester } from "circomkit" +import { poseidon2 } from "poseidon-lite" +import { circomkit } from "./common" + +describe("semaphore", () => { + let circuit: WitnessTester< + ["privateKey", "treeDepth", "treeIndices", "treeSiblings", "scope", "message"], + ["nullifier", "treeRoot"] + > + + const MAX_DEPTH = 20 + + const scope = 32 + const message = 43 + + const privateKey = 1 + const publicKey = derivePublicKey(privateKey) + + const leaf = poseidon2(publicKey) + + const tree = new LeanIMT((a, b) => poseidon2([a, b])) + + tree.insert(leaf) + + for (let i = 1; i < 4; i += 1) { + tree.insert(BigInt(i)) + } + + const { siblings: treeSiblings, index } = tree.generateProof(0) + + // The index must be converted to a list of indices, 1 for each tree level. + // The circuit tree depth is 20, so the number of siblings must be 20, even if + // the tree depth is actually 3. The missing siblings can be set to 0, as they + // won't be used to calculate the root in the circuit. + const treeIndices: number[] = [] + + for (let i = 0; i < MAX_DEPTH; i += 1) { + treeIndices.push((index >> i) & 1) + + if (treeSiblings[i] === undefined) { + treeSiblings[i] = BigInt(0) + } + } + + const INPUT = { + privateKey: deriveSecretScalar(privateKey), + treeDepth: tree.depth, + treeIndices, + treeSiblings, + scope, + message + } + + const OUTPUT = { + nullifier: poseidon2([scope, deriveSecretScalar(privateKey)]), + treeRoot: tree.root + } + + before(async () => { + circuit = await circomkit.WitnessTester("semaphore", { + file: "semaphore", + template: "Semaphore", + params: [MAX_DEPTH] + }) + }) + + it("Should calculate the root and the nullifier correctly", async () => { + await circuit.expectPass(INPUT, OUTPUT) + }) +}) diff --git a/packages/circuits/tree.circom b/packages/circuits/tree.circom deleted file mode 100644 index 6f5951dbe..000000000 --- a/packages/circuits/tree.circom +++ /dev/null @@ -1,40 +0,0 @@ -pragma circom 2.0.0; - -include "../node_modules/circomlib/circuits/poseidon.circom"; -include "../node_modules/circomlib/circuits/mux1.circom"; - -template MerkleTreeInclusionProof(nLevels) { - signal input leaf; - signal input pathIndices[nLevels]; - signal input siblings[nLevels]; - - signal output root; - - component poseidons[nLevels]; - component mux[nLevels]; - - signal hashes[nLevels + 1]; - hashes[0] <== leaf; - - for (var i = 0; i < nLevels; i++) { - pathIndices[i] * (1 - pathIndices[i]) === 0; - - poseidons[i] = Poseidon(2); - mux[i] = MultiMux1(2); - - mux[i].c[0][0] <== hashes[i]; - mux[i].c[0][1] <== siblings[i]; - - mux[i].c[1][0] <== siblings[i]; - mux[i].c[1][1] <== hashes[i]; - - mux[i].s <== pathIndices[i]; - - poseidons[i].inputs[0] <== mux[i].out[0]; - poseidons[i].inputs[1] <== mux[i].out[1]; - - hashes[i + 1] <== poseidons[i].out; - } - - root <== hashes[nLevels]; -} diff --git a/yarn.lock b/yarn.lock index 6080ca0da..55a1ce88c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2812,6 +2812,23 @@ __metadata: languageName: node linkType: hard +"@iden3/bigarray@npm:0.0.2": + version: 0.0.2 + resolution: "@iden3/bigarray@npm:0.0.2" + checksum: a58a4aa75284f7c74ef8a43dd0720764e94389ae4314213f18de9d712fbdb170dd0e9b48672ad297b5f15bd1658d3bff33fe1998e189b48cbf501f1fe78f0adc + languageName: node + linkType: hard + +"@iden3/binfileutils@npm:0.0.11": + version: 0.0.11 + resolution: "@iden3/binfileutils@npm:0.0.11" + dependencies: + fastfile: 0.0.20 + ffjavascript: ^0.2.48 + checksum: ca61db1325c7e038c6bd723c856eff5f2c82c76394db09d3350ef4f5b7525e3c9ab1f7429900ff5d3e9d26c5970bf5900e6126ccb5c5caa597c16a47336a6be8 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4385,6 +4402,21 @@ __metadata: languageName: node linkType: hard +"@semaphore-protocol/circuits@workspace:packages/circuits": + version: 0.0.0-use.local + resolution: "@semaphore-protocol/circuits@workspace:packages/circuits" + dependencies: + "@types/mocha": ^10.0.6 + "@zk-kit/circuits": 0.2.3 + "@zk-kit/eddsa-poseidon": 0.3.1 + "@zk-kit/imt": ^2.0.0-beta + circomkit: ^0.0.19 + circomlib: 2.0.5 + mocha: ^10.2.0 + poseidon-lite: ^0.2.0 + languageName: unknown + linkType: soft + "@semaphore-protocol/cli-template-contracts-hardhat@workspace:packages/cli-template-contracts-hardhat": version: 0.0.0-use.local resolution: "@semaphore-protocol/cli-template-contracts-hardhat@workspace:packages/cli-template-contracts-hardhat" @@ -5267,6 +5299,13 @@ __metadata: languageName: node linkType: hard +"@types/mocha@npm:^10.0.6": + version: 10.0.6 + resolution: "@types/mocha@npm:10.0.6" + checksum: f7c836cf6cf27dc0f5970d262591b56f2a3caeaec8cfdc612c12e1cfbb207f601f710ece207e935164d4e3343b93be5054d0db5544f31f453b3923775d82099f + languageName: node + linkType: hard + "@types/mocha@npm:^9.1.0, @types/mocha@npm:^9.1.1": version: 9.1.1 resolution: "@types/mocha@npm:9.1.1" @@ -5716,6 +5755,22 @@ __metadata: languageName: node linkType: hard +"@zk-kit/circuits@npm:0.2.3": + version: 0.2.3 + resolution: "@zk-kit/circuits@npm:0.2.3" + dependencies: + circomlib: ^2.0.5 + checksum: 9d7f812c7c67d33870b44c1c45bd52fb10c1a5f60c8c99e3765216cb2e9326c9a7d17542e4460baa65902944f5d7e1986ee01d15f5bbc7398d4c4166fc33d770 + languageName: node + linkType: hard + +"@zk-kit/eddsa-poseidon@npm:0.3.1": + version: 0.3.1 + resolution: "@zk-kit/eddsa-poseidon@npm:0.3.1" + checksum: 5c3a9274908907d4d988c19bebf0d97c961e6a500c2e063a7aa8ecc33f95dace9549f442f8bbf1fa94542b687cf761ba7f77cf7d64165ccd28aad22c3caecd29 + languageName: node + linkType: hard + "@zk-kit/groth16@npm:0.3.0": version: 0.3.0 resolution: "@zk-kit/groth16@npm:0.3.0" @@ -5726,6 +5781,13 @@ __metadata: languageName: node linkType: hard +"@zk-kit/imt@npm:^2.0.0-beta": + version: 2.0.0-beta + resolution: "@zk-kit/imt@npm:2.0.0-beta" + checksum: e4fdde4c171df9ab2c0b02f38ba480418231239aebf362098186a59537c19e24d7985ff11ff9e908f23d54ca620e81edfecf82d52b2c881677f89cd8654cdb80 + languageName: node + linkType: hard + "@zk-kit/incremental-merkle-tree.sol@npm:1.3.3": version: 1.3.3 resolution: "@zk-kit/incremental-merkle-tree.sol@npm:1.3.3" @@ -6625,6 +6687,19 @@ __metadata: languageName: node linkType: hard +"bfj@npm:^7.0.2": + version: 7.1.0 + resolution: "bfj@npm:7.1.0" + dependencies: + bluebird: ^3.7.2 + check-types: ^11.2.3 + hoopy: ^0.1.4 + jsonpath: ^1.1.1 + tryer: ^1.0.1 + checksum: 36da9ed36c60f377a3f43bb0433092af7dc40442914b8155a1330ae86b1905640baf57e9c195ab83b36d6518b27cf8ed880adff663aa444c193be149e027d722 + languageName: node + linkType: hard + "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -6733,7 +6808,7 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:^3.5.0": +"bluebird@npm:^3.5.0, bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef @@ -7414,6 +7489,21 @@ __metadata: languageName: node linkType: hard +"chai@npm:^4.3.6, chai@npm:^4.3.7": + version: 4.3.10 + resolution: "chai@npm:4.3.10" + dependencies: + assertion-error: ^1.1.0 + check-error: ^1.0.3 + deep-eql: ^4.1.3 + get-func-name: ^2.0.2 + loupe: ^2.3.6 + pathval: ^1.1.1 + type-detect: ^4.0.8 + checksum: 536668c60a0d985a0fbd94418028e388d243a925d7c5e858c7443e334753511614a3b6a124bac9ca077dfc4c37acc367d62f8c294960f440749536dc181dfc6d + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -7532,6 +7622,29 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: ^2.0.2 + checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 + languageName: node + linkType: hard + +"check-types@npm:^11.2.3": + version: 11.2.3 + resolution: "check-types@npm:11.2.3" + checksum: f99ff09ae65e63cfcfa40a1275c0a70d8c43ffbf9ac35095f3bf030cc70361c92e075a9975a1144329e50b4fe4620be6bedb4568c18abc96071a3e23aed3ed8e + languageName: node + linkType: hard + +"child_process@npm:^1.0.2": + version: 1.0.2 + resolution: "child_process@npm:1.0.2" + checksum: bd814d82bc8c6e85ed6fb157878978121cd03b5296c09f6135fa3d081fd9a6a617a6d509c50397711df713af403331241a9c0397a7fad30672051485e156c2a1 + languageName: node + linkType: hard + "chokidar@npm:3.3.0": version: 3.3.0 resolution: "chokidar@npm:3.3.0" @@ -7621,6 +7734,17 @@ __metadata: languageName: node linkType: hard +"circom_runtime@npm:0.1.21": + version: 0.1.21 + resolution: "circom_runtime@npm:0.1.21" + dependencies: + ffjavascript: 0.2.56 + bin: + calcwit: calcwit.js + checksum: 3071f1e0fba9a5fb41c940454edb911ce09edfd5d0bd12156ec79045a0bf3ff2cc5b35f46e84e42902ef8bb0a4166f428b75d0ceb363c0d485f1a111b27daba1 + languageName: node + linkType: hard + "circom_runtime@npm:0.1.24": version: 0.1.24 resolution: "circom_runtime@npm:0.1.24" @@ -7632,7 +7756,37 @@ __metadata: languageName: node linkType: hard -"circomlib@npm:^2.0.2": +"circom_tester@npm:^0.0.19": + version: 0.0.19 + resolution: "circom_tester@npm:0.0.19" + dependencies: + chai: ^4.3.6 + child_process: ^1.0.2 + ffjavascript: ^0.2.56 + fnv-plus: ^1.3.1 + r1csfile: ^0.0.41 + snarkjs: 0.5.0 + tmp-promise: ^3.0.3 + util: ^0.12.4 + checksum: 703d7317493ddafb33462b5b0caf9b8a95bde938429e030d024fa7ac41ccb45a9ddbe8ebb93f91138dbee94bb2e0d504570c0aca070802d79ee532ba1ae5db0e + languageName: node + linkType: hard + +"circomkit@npm:^0.0.19": + version: 0.0.19 + resolution: "circomkit@npm:0.0.19" + dependencies: + chai: ^4.3.7 + circom_tester: ^0.0.19 + loglevel: ^1.8.1 + snarkjs: ^0.7.0 + bin: + circomkit: dist/bin/index.js + checksum: b3d7ef5b29277ee31af7fcb7a53af46c43321d16ab238b803e2fb65a88143a8aae02eebc7c8387e6d0158450ca8bee053adb40e34331392b5fa0f1d2dabc6b40 + languageName: node + linkType: hard + +"circomlib@npm:2.0.5, circomlib@npm:^2.0.2, circomlib@npm:^2.0.5": version: 2.0.5 resolution: "circomlib@npm:2.0.5" checksum: df8c3e0d51007758e30bb7ebad059ce692836420c85179088a20581c0adbf8f969d8cf901f9047adfcb80d45741eef4abe4d0d5e4c46748ace06e04256b5bfe7 @@ -7651,14 +7805,6 @@ __metadata: languageName: node linkType: hard -"circuits@workspace:packages/circuits": - version: 0.0.0-use.local - resolution: "circuits@workspace:packages/circuits" - dependencies: - circomlib: ^2.0.2 - languageName: unknown - linkType: soft - "cjs-module-lexer@npm:^1.0.0": version: 1.2.2 resolution: "cjs-module-lexer@npm:1.2.2" @@ -8697,7 +8843,7 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.2": +"deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.2, deep-eql@npm:^4.1.3": version: 4.1.3 resolution: "deep-eql@npm:4.1.3" dependencies: @@ -9361,6 +9507,25 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^1.8.1": + version: 1.14.3 + resolution: "escodegen@npm:1.14.3" + dependencies: + esprima: ^4.0.1 + estraverse: ^4.2.0 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 381cdc4767ecdb221206bbbab021b467bbc2a6f5c9a99c9e6353040080bdd3dfe73d7604ad89a47aca6ea7d58bc635f6bd3fbc8da9a1998e9ddfa8372362ccd0 + languageName: node + linkType: hard + "escodegen@npm:^2.0.0": version: 2.0.0 resolution: "escodegen@npm:2.0.0" @@ -9573,6 +9738,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:1.2.2": + version: 1.2.2 + resolution: "esprima@npm:1.2.2" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 4f10006f0e315f2f7d8cf6630e465f183512f1ab2e862b11785a133ce37ed1696573deefb5256e510eaa4368342b13b393334477f6ccdcdb8f10e782b0f5e6dc + languageName: node + linkType: hard + "esprima@npm:2.7.x, esprima@npm:^2.7.1": version: 2.7.3 resolution: "esprima@npm:2.7.3" @@ -9618,7 +9793,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": +"estraverse@npm:^4.1.1, estraverse@npm:^4.2.0": version: 4.3.0 resolution: "estraverse@npm:4.3.0" checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 @@ -10152,6 +10327,13 @@ __metadata: languageName: node linkType: hard +"fastfile@npm:0.0.20": + version: 0.0.20 + resolution: "fastfile@npm:0.0.20" + checksum: e5d6e5f57a9b58c9534202e477cbffbca2182c407171950695ddb5c3e6b89554bc8561fbb6e370c99e371a8f23486a23fbaca527827886cec4897d481cbd03b6 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.15.0 resolution: "fastq@npm:1.15.0" @@ -10189,6 +10371,17 @@ __metadata: languageName: node linkType: hard +"ffjavascript@npm:0.2.56": + version: 0.2.56 + resolution: "ffjavascript@npm:0.2.56" + dependencies: + wasmbuilder: 0.0.16 + wasmcurves: 0.2.0 + web-worker: ^1.2.0 + checksum: d4e02263db4a94d111cdc7c1211ae96769370f5c8c3c338331e0ef99faed7b55e640bedf23fa8a83fc9a77f0e81140ea8f32e392812a00e15ca504221b879a4f + languageName: node + linkType: hard + "ffjavascript@npm:0.2.60, ffjavascript@npm:^0.2.45": version: 0.2.60 resolution: "ffjavascript@npm:0.2.60" @@ -10200,6 +10393,17 @@ __metadata: languageName: node linkType: hard +"ffjavascript@npm:0.2.62, ffjavascript@npm:^0.2.48, ffjavascript@npm:^0.2.56": + version: 0.2.62 + resolution: "ffjavascript@npm:0.2.62" + dependencies: + wasmbuilder: 0.0.16 + wasmcurves: 0.2.2 + web-worker: ^1.2.0 + checksum: c292e88fd160e16aadfac27870fc5532d3ed1f2306f51d77ef37d5077fca0146b475ffa44a52b80a489ce8834f9c1f4853265499dcb5d0b8f0ec551341c318da + languageName: node + linkType: hard + "figlet@npm:^1.5.2": version: 1.5.2 resolution: "figlet@npm:1.5.2" @@ -10445,6 +10649,13 @@ __metadata: languageName: node linkType: hard +"fnv-plus@npm:^1.3.1": + version: 1.3.1 + resolution: "fnv-plus@npm:1.3.1" + checksum: 4d3de8026d538ffab13dfa38ac0662b045b2ad0f920efa54f1ca65f59ad1a49b4d62482c5fcdc9cce0a18d9852df1db97c618937089d85678ce03f2e76b07e8b + languageName: node + linkType: hard + "follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.0": version: 1.15.2 resolution: "follow-redirects@npm:1.15.2" @@ -10804,6 +11015,13 @@ __metadata: languageName: node linkType: hard +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b + languageName: node + linkType: hard + "get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": version: 1.2.0 resolution: "get-intrinsic@npm:1.2.0" @@ -11761,6 +11979,13 @@ __metadata: languageName: node linkType: hard +"hoopy@npm:^0.1.4": + version: 0.1.4 + resolution: "hoopy@npm:0.1.4" + checksum: cfa60c7684c5e1ee4efe26e167bc54b73f839ffb59d1d44a5c4bf891e26b4f5bcc666555219a98fec95508fea4eda3a79540c53c05cc79afc1f66f9a238f4d9e + languageName: node + linkType: hard + "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -13574,6 +13799,17 @@ __metadata: languageName: node linkType: hard +"jsonpath@npm:^1.1.1": + version: 1.1.1 + resolution: "jsonpath@npm:1.1.1" + dependencies: + esprima: 1.2.2 + static-eval: 2.0.2 + underscore: 1.12.1 + checksum: 5480d8e9e424fe2ed4ade6860b6e2cefddb21adb3a99abe0254cd9428e8ef9b0c9fb5729d6a5a514e90df50d645ccea9f3be48d627570e6222dd5dadc28eba7b + languageName: node + linkType: hard + "jsonpointer@npm:^5.0.0": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" @@ -13945,6 +14181,20 @@ __metadata: languageName: node linkType: hard +"loglevel@npm:^1.8.1": + version: 1.8.1 + resolution: "loglevel@npm:1.8.1" + checksum: a1a62db40291aaeaef2f612334c49e531bff71cc1d01a2acab689ab80d59e092f852ab164a5aedc1a752fdc46b7b162cb097d8a9eb2cf0b299511106c29af61d + languageName: node + linkType: hard + +"logplease@npm:^1.2.15": + version: 1.2.15 + resolution: "logplease@npm:1.2.15" + checksum: c2ac90a75dfa28234f67c79a112baf3c7d7a3011a6d16b052e299ad2f37430fd17959fa116629e14ef3b56796a2dd7015802d0a835ded107ceacb0ca5a44393f + languageName: node + linkType: hard + "longest@npm:^2.0.1": version: 2.0.1 resolution: "longest@npm:2.0.1" @@ -13972,6 +14222,15 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^2.3.6": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: ^2.0.1 + checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b + languageName: node + linkType: hard + "lowercase-keys@npm:1.0.0": version: 1.0.0 resolution: "lowercase-keys@npm:1.0.0" @@ -14725,7 +14984,7 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.0.0": +"mocha@npm:^10.0.0, mocha@npm:^10.2.0": version: 10.2.0 resolution: "mocha@npm:10.2.0" dependencies: @@ -16602,6 +16861,30 @@ __metadata: languageName: node linkType: hard +"r1csfile@npm:0.0.41, r1csfile@npm:^0.0.41": + version: 0.0.41 + resolution: "r1csfile@npm:0.0.41" + dependencies: + "@iden3/bigarray": 0.0.2 + "@iden3/binfileutils": 0.0.11 + fastfile: 0.0.20 + ffjavascript: 0.2.56 + checksum: eec689416f66f09db2d6ca66fac1ef6841b088ab29abcde487145ebd2110916c92583e11ac86f0cdcc4e8a3a7c7df9ff5352ad959e8ae385d37c3b51cec5cf4d + languageName: node + linkType: hard + +"r1csfile@npm:0.0.47": + version: 0.0.47 + resolution: "r1csfile@npm:0.0.47" + dependencies: + "@iden3/bigarray": 0.0.2 + "@iden3/binfileutils": 0.0.11 + fastfile: 0.0.20 + ffjavascript: 0.2.60 + checksum: edeb325b83851a71cbca2e5de56eb622ee5347ecae921b526a5fc484c4825b6b30c73b6fde40e9bc5112b9d21e046af885bf212ed9cee2efbc6de93b8454ec06 + languageName: node + linkType: hard + "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -17948,6 +18231,46 @@ __metadata: languageName: node linkType: hard +"snarkjs@npm:0.5.0": + version: 0.5.0 + resolution: "snarkjs@npm:0.5.0" + dependencies: + "@iden3/binfileutils": 0.0.11 + bfj: ^7.0.2 + blake2b-wasm: ^2.4.0 + circom_runtime: 0.1.21 + ejs: ^3.1.6 + fastfile: 0.0.20 + ffjavascript: 0.2.56 + js-sha3: ^0.8.0 + logplease: ^1.2.15 + r1csfile: 0.0.41 + bin: + snarkjs: build/cli.cjs + checksum: f0233103548bcd0f75b2ff8998ba02437e5131486d126c4a6a31355cd3558c7ce4311e21d5f24ea9ca198d0556e91e63e2ec6aef8da44014c16b29b6a7086ca2 + languageName: node + linkType: hard + +"snarkjs@npm:^0.7.0": + version: 0.7.2 + resolution: "snarkjs@npm:0.7.2" + dependencies: + "@iden3/binfileutils": 0.0.11 + bfj: ^7.0.2 + blake2b-wasm: ^2.4.0 + circom_runtime: 0.1.24 + ejs: ^3.1.6 + fastfile: 0.0.20 + ffjavascript: 0.2.62 + js-sha3: ^0.8.0 + logplease: ^1.2.15 + r1csfile: 0.0.47 + bin: + snarkjs: build/cli.cjs + checksum: c784e2171278403b2356ddc42fac47093e7cf4c48c0ef46ac3c269c308795d2da63a00dd6b92521b166f3d0349d0b8301454f5a9633b5db447755b4568c4b5e7 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -18295,6 +18618,15 @@ __metadata: languageName: node linkType: hard +"static-eval@npm:2.0.2": + version: 2.0.2 + resolution: "static-eval@npm:2.0.2" + dependencies: + escodegen: ^1.8.1 + checksum: 335a923c5ccb29add404ac23d0a55c0da6cee3071f6f67a7053aeac0dedc6dbfc53ac9269e9c25f403f5b7603a291ef47d7114f99bde241184f7aa3f9286dc32 + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -18973,6 +19305,15 @@ __metadata: languageName: node linkType: hard +"tmp-promise@npm:^3.0.3": + version: 3.0.3 + resolution: "tmp-promise@npm:3.0.3" + dependencies: + tmp: ^0.2.0 + checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c + languageName: node + linkType: hard + "tmp@npm:0.0.33, tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -18982,6 +19323,15 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.0": + version: 0.2.1 + resolution: "tmp@npm:0.2.1" + dependencies: + rimraf: ^3.0.0 + checksum: 8b1214654182575124498c87ca986ac53dc76ff36e8f0e0b67139a8d221eaecfdec108c0e6ec54d76f49f1f72ab9325500b246f562b926f85bcdfca8bf35df9e + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -19089,6 +19439,13 @@ __metadata: languageName: node linkType: hard +"tryer@npm:^1.0.1": + version: 1.0.1 + resolution: "tryer@npm:1.0.1" + checksum: 1cf14d7f67c79613f054b569bfc9a89c7020d331573a812dfcf7437244e8f8e6eb6893b210cbd9cc217f67c1d72617f89793df231e4fe7d53634ed91cf3a89d1 + languageName: node + linkType: hard + "ts-command-line-args@npm:^2.2.0": version: 2.4.2 resolution: "ts-command-line-args@npm:2.4.2" @@ -19253,7 +19610,7 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": +"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.5, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 @@ -19538,6 +19895,13 @@ __metadata: languageName: node linkType: hard +"underscore@npm:1.12.1": + version: 1.12.1 + resolution: "underscore@npm:1.12.1" + checksum: ec327603aa112b99fe9d74cd9bf3b3b7451465a9d2610ceab269a532e3f191650ab017903be34dc86fe406a11d04d8905a3b04dd4c129493e51bee09a3f3074c + languageName: node + linkType: hard + "undici@npm:^5.12.0": version: 5.21.0 resolution: "undici@npm:5.21.0" @@ -19782,7 +20146,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.0, util@npm:^0.12.5": +"util@npm:^0.12.0, util@npm:^0.12.4, util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -19964,6 +20328,15 @@ __metadata: languageName: node linkType: hard +"wasmcurves@npm:0.2.0": + version: 0.2.0 + resolution: "wasmcurves@npm:0.2.0" + dependencies: + wasmbuilder: 0.0.16 + checksum: 0769ca2d0c2f99619436f86dcab16294d94cc0c8a114b0c5e6ed71df49625a6ad35000011fee57471b7647838eeb75f631e74b200996ac2513e8ca0c47e5b8d0 + languageName: node + linkType: hard + "wasmcurves@npm:0.2.2": version: 0.2.2 resolution: "wasmcurves@npm:0.2.2"