@semaphore-protocol/proof 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  <h1 align="center">
3
3
  Semaphore proof
4
4
  </h1>
5
- <p align="center">A library for generating and verifying Semaphore proofs.</p>
5
+ <p align="center">A library to generate and verify Semaphore proofs.</p>
6
6
  </p>
7
7
 
8
8
  <p align="center">
@@ -58,44 +58,20 @@ yarn add @semaphore-protocol/proof
58
58
 
59
59
  ## 📜 Usage
60
60
 
61
- \# **createMerkleTree**(depth: _number_, zeroValue: _BigNumberish_, leaves: _BigNumberish\[]_): _MerkleProof_
62
-
63
- ```typescript
64
- import { createMerkleTree } from "@semaphore-protocol/proof"
65
-
66
- const depth = 20
67
- const zeroValue = BigInt(0)
68
- const leaves = [BigInt(1), BigInt(2)]
69
-
70
- const merkleTree = createMerkleTree(treeDepth, zeroValue, leaves)
71
- ```
72
-
73
- \# **createMerkleProof**(depth: _number_, zeroValue: _BigNumberish_, leaves: _BigNumberish\[]_, leaf: _BigNumberish_): _MerkleProof_
74
-
75
- ```typescript
76
- import { Identity } from "@semaphore-protocol/identity"
77
- import { createMerkleProof } from "@semaphore-protocol/proof"
78
-
79
- const depth = 20
80
- const zeroValue = BigInt(0)
81
-
82
- const identity = new Identity()
83
-
84
- const leaf = identity.genIdentityCommitment()
85
- const leaves = [BigInt(1), identityCommitment, BigInt(2)]
86
-
87
- const merkleProof = createMerkleProof(treeDepth, zeroValue, leaves, leaf)
88
- ```
89
-
90
- \# **generateProof**(identity: _Identity_, merkleProof: _MerkleProof_, externalNullifier: _BigNumberish_, signal: _string_, snarkArtifacts: _SnarkArtifacts_): Promise\<_SemaphoreFullProof_>
61
+ \# **generateProof**(identity: _Identity_, group: _Group_, externalNullifier: _BigNumberish_, signal: _string_, snarkArtifacts: _SnarkArtifacts_): Promise\<_SemaphoreFullProof_>
91
62
 
92
63
  ```typescript
93
64
  import { Identity } from "@semaphore-protocol/identity"
65
+ import { Group } from "@semaphore-protocol/group"
94
66
  import { generateProof } from "@semaphore-protocol/proof"
95
67
 
68
+ const identity = new Identity()
69
+ const group = new Group()
96
70
  const externalNullifier = BigInt(1)
97
71
  const signal = "Hello world"
98
72
 
73
+ group.addMembers([...identityCommitments, identity.generateCommitment()])
74
+
99
75
  const fullProof = await generateProof(identity, merkleProof, externalNullifier, signal, {
100
76
  zkeyFilePath: "./semaphore.zkey",
101
77
  wasmFilePath: "./semaphore.wasm"
package/dist/index.mjs CHANGED
@@ -1,55 +1,16 @@
1
1
  /**
2
2
  * @module @semaphore-protocol/proof
3
- * @version 0.2.1
4
- * @file A library for generating and verifying Semaphore proofs.
3
+ * @version 0.3.1
4
+ * @file A library to generate and verify Semaphore proofs.
5
5
  * @copyright Ethereum Foundation 2022
6
6
  * @license MIT
7
7
  * @see [Github]{@link https://github.com/semaphore-protocol/semaphore.js/tree/main/packages/proof}
8
8
  */
9
- import { IncrementalMerkleTree } from '@zk-kit/incremental-merkle-tree';
10
9
  import { poseidon } from 'circomlibjs';
11
10
  import { groth16 } from 'snarkjs';
12
11
  import { keccak256 } from '@ethersproject/solidity';
13
12
  import { formatBytes32String } from '@ethersproject/strings';
14
13
 
15
- /**
16
- * Creates a Merkle tree.
17
- * @param depth The depth of the tree.
18
- * @param zeroValue The zero value of the tree.
19
- * @param leaves The list of the leaves of the tree.
20
- * @returns The Merkle tree.
21
- */
22
- function createMerkleTree(depth, zeroValue, leaves) {
23
- var tree = new IncrementalMerkleTree(poseidon, depth, zeroValue, 2);
24
- for (var _i = 0, leaves_1 = leaves; _i < leaves_1.length; _i++) {
25
- var leaf = leaves_1[_i];
26
- if (leaf === zeroValue) {
27
- throw new Error("Leaves cannot have zero values");
28
- }
29
- tree.insert(BigInt(leaf));
30
- }
31
- return tree;
32
- }
33
-
34
- /**
35
- * Creates a Merkle proof.
36
- * @param depth The depth of the tree.
37
- * @param zeroValue The zero value of the tree.
38
- * @param leaves The list of the leaves of the tree.
39
- * @param leaf The leaf for which Merkle proof should be created.
40
- * @returns The Merkle proof.
41
- */
42
- function createMerkleProof(depth, zeroValue, leaves, leaf) {
43
- var tree = createMerkleTree(depth, zeroValue, leaves);
44
- var leafIndex = tree.leaves.indexOf(BigInt(leaf));
45
- if (leafIndex === -1) {
46
- throw new Error("The leaf does not exist");
47
- }
48
- var merkleProof = tree.createProof(leafIndex);
49
- merkleProof.siblings = merkleProof.siblings.map(function (s) { return s[0]; });
50
- return merkleProof;
51
- }
52
-
53
14
  /**
54
15
  * Generates a nullifier by hashing the external and the identity nullifiers.
55
16
  * @param externalNullifier The external nullifier.
@@ -122,19 +83,26 @@ function genSignalHash(signal) {
122
83
  return BigInt(keccak256(["bytes32"], [formatBytes32String(signal)])) >> BigInt(8);
123
84
  }
124
85
 
125
- function generateProof(identity, merkleProof, externalNullifier, signal, snarkArtifacts) {
86
+ function generateProof(identity, group, externalNullifier, signal, snarkArtifacts) {
126
87
  return __awaiter(this, void 0, void 0, function () {
127
- var _a, proof, publicSignals;
88
+ var commitment, index, merkleProof, _a, proof, publicSignals;
128
89
  return __generator(this, function (_b) {
129
90
  switch (_b.label) {
130
- case 0: return [4 /*yield*/, groth16.fullProve({
131
- identityTrapdoor: identity.getTrapdoor(),
132
- identityNullifier: identity.getNullifier(),
133
- treePathIndices: merkleProof.pathIndices,
134
- treeSiblings: merkleProof.siblings,
135
- externalNullifier: externalNullifier,
136
- signalHash: genSignalHash(signal)
137
- }, snarkArtifacts.wasmFilePath, snarkArtifacts.zkeyFilePath)];
91
+ case 0:
92
+ commitment = identity.generateCommitment();
93
+ index = group.indexOf(commitment);
94
+ if (index === -1) {
95
+ throw new Error("The identity is not part of the group");
96
+ }
97
+ merkleProof = group.generateProofOfMembership(index);
98
+ return [4 /*yield*/, groth16.fullProve({
99
+ identityTrapdoor: identity.getTrapdoor(),
100
+ identityNullifier: identity.getNullifier(),
101
+ treePathIndices: merkleProof.pathIndices,
102
+ treeSiblings: merkleProof.siblings,
103
+ externalNullifier: externalNullifier,
104
+ signalHash: genSignalHash(signal)
105
+ }, snarkArtifacts.wasmFilePath, snarkArtifacts.zkeyFilePath)];
138
106
  case 1:
139
107
  _a = _b.sent(), proof = _a.proof, publicSignals = _a.publicSignals;
140
108
  return [2 /*return*/, {
@@ -185,4 +153,4 @@ function packToSolidityProof(proof) {
185
153
  ];
186
154
  }
187
155
 
188
- export { createMerkleProof, createMerkleTree, generateNullifierHash, generateProof, genSignalHash as generateSignalHash, packToSolidityProof, verifyProof };
156
+ export { generateNullifierHash, generateProof, genSignalHash as generateSignalHash, packToSolidityProof, verifyProof };
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @module @semaphore-protocol/proof
3
- * @version 0.2.1
4
- * @file A library for generating and verifying Semaphore proofs.
3
+ * @version 0.3.1
4
+ * @file A library to generate and verify Semaphore proofs.
5
5
  * @copyright Ethereum Foundation 2022
6
6
  * @license MIT
7
7
  * @see [Github]{@link https://github.com/semaphore-protocol/semaphore.js/tree/main/packages/proof}
@@ -10,50 +10,11 @@
10
10
 
11
11
  Object.defineProperty(exports, '__esModule', { value: true });
12
12
 
13
- var incrementalMerkleTree = require('@zk-kit/incremental-merkle-tree');
14
13
  var circomlibjs = require('circomlibjs');
15
14
  var snarkjs = require('snarkjs');
16
15
  var solidity = require('@ethersproject/solidity');
17
16
  var strings = require('@ethersproject/strings');
18
17
 
19
- /**
20
- * Creates a Merkle tree.
21
- * @param depth The depth of the tree.
22
- * @param zeroValue The zero value of the tree.
23
- * @param leaves The list of the leaves of the tree.
24
- * @returns The Merkle tree.
25
- */
26
- function createMerkleTree(depth, zeroValue, leaves) {
27
- var tree = new incrementalMerkleTree.IncrementalMerkleTree(circomlibjs.poseidon, depth, zeroValue, 2);
28
- for (var _i = 0, leaves_1 = leaves; _i < leaves_1.length; _i++) {
29
- var leaf = leaves_1[_i];
30
- if (leaf === zeroValue) {
31
- throw new Error("Leaves cannot have zero values");
32
- }
33
- tree.insert(BigInt(leaf));
34
- }
35
- return tree;
36
- }
37
-
38
- /**
39
- * Creates a Merkle proof.
40
- * @param depth The depth of the tree.
41
- * @param zeroValue The zero value of the tree.
42
- * @param leaves The list of the leaves of the tree.
43
- * @param leaf The leaf for which Merkle proof should be created.
44
- * @returns The Merkle proof.
45
- */
46
- function createMerkleProof(depth, zeroValue, leaves, leaf) {
47
- var tree = createMerkleTree(depth, zeroValue, leaves);
48
- var leafIndex = tree.leaves.indexOf(BigInt(leaf));
49
- if (leafIndex === -1) {
50
- throw new Error("The leaf does not exist");
51
- }
52
- var merkleProof = tree.createProof(leafIndex);
53
- merkleProof.siblings = merkleProof.siblings.map(function (s) { return s[0]; });
54
- return merkleProof;
55
- }
56
-
57
18
  /**
58
19
  * Generates a nullifier by hashing the external and the identity nullifiers.
59
20
  * @param externalNullifier The external nullifier.
@@ -126,19 +87,26 @@ function genSignalHash(signal) {
126
87
  return BigInt(solidity.keccak256(["bytes32"], [strings.formatBytes32String(signal)])) >> BigInt(8);
127
88
  }
128
89
 
129
- function generateProof(identity, merkleProof, externalNullifier, signal, snarkArtifacts) {
90
+ function generateProof(identity, group, externalNullifier, signal, snarkArtifacts) {
130
91
  return __awaiter(this, void 0, void 0, function () {
131
- var _a, proof, publicSignals;
92
+ var commitment, index, merkleProof, _a, proof, publicSignals;
132
93
  return __generator(this, function (_b) {
133
94
  switch (_b.label) {
134
- case 0: return [4 /*yield*/, snarkjs.groth16.fullProve({
135
- identityTrapdoor: identity.getTrapdoor(),
136
- identityNullifier: identity.getNullifier(),
137
- treePathIndices: merkleProof.pathIndices,
138
- treeSiblings: merkleProof.siblings,
139
- externalNullifier: externalNullifier,
140
- signalHash: genSignalHash(signal)
141
- }, snarkArtifacts.wasmFilePath, snarkArtifacts.zkeyFilePath)];
95
+ case 0:
96
+ commitment = identity.generateCommitment();
97
+ index = group.indexOf(commitment);
98
+ if (index === -1) {
99
+ throw new Error("The identity is not part of the group");
100
+ }
101
+ merkleProof = group.generateProofOfMembership(index);
102
+ return [4 /*yield*/, snarkjs.groth16.fullProve({
103
+ identityTrapdoor: identity.getTrapdoor(),
104
+ identityNullifier: identity.getNullifier(),
105
+ treePathIndices: merkleProof.pathIndices,
106
+ treeSiblings: merkleProof.siblings,
107
+ externalNullifier: externalNullifier,
108
+ signalHash: genSignalHash(signal)
109
+ }, snarkArtifacts.wasmFilePath, snarkArtifacts.zkeyFilePath)];
142
110
  case 1:
143
111
  _a = _b.sent(), proof = _a.proof, publicSignals = _a.publicSignals;
144
112
  return [2 /*return*/, {
@@ -189,8 +157,6 @@ function packToSolidityProof(proof) {
189
157
  ];
190
158
  }
191
159
 
192
- exports.createMerkleProof = createMerkleProof;
193
- exports.createMerkleTree = createMerkleTree;
194
160
  exports.generateNullifierHash = generateNullifierHash;
195
161
  exports.generateProof = generateProof;
196
162
  exports.generateSignalHash = genSignalHash;
@@ -1,4 +1,4 @@
1
1
  import type { Identity } from "@semaphore-protocol/identity";
2
- import { MerkleProof } from "@zk-kit/incremental-merkle-tree";
2
+ import { Group } from "@semaphore-protocol/group";
3
3
  import { BigNumberish, FullProof, SnarkArtifacts } from "./types";
4
- export default function generateProof(identity: Identity, merkleProof: MerkleProof, externalNullifier: BigNumberish, signal: string, snarkArtifacts: SnarkArtifacts): Promise<FullProof>;
4
+ export default function generateProof(identity: Identity, group: Group, externalNullifier: BigNumberish, signal: string, snarkArtifacts: SnarkArtifacts): Promise<FullProof>;
@@ -1,10 +1,7 @@
1
- import { MerkleProof } from "@zk-kit/incremental-merkle-tree";
2
- import createMerkleTree from "./createMerkleTree";
3
- import createMerkleProof from "./createMerkleProof";
4
1
  import generateNullifierHash from "./generateNullifierHash";
5
2
  import generateProof from "./generateProof";
6
3
  import verifyProof from "./verifyProof";
7
4
  import generateSignalHash from "./generateSignalHash";
8
5
  import packToSolidityProof from "./packToSolidityProof";
9
- export { MerkleProof, createMerkleTree, createMerkleProof, generateNullifierHash, generateProof, verifyProof, generateSignalHash, packToSolidityProof };
6
+ export { generateNullifierHash, generateProof, verifyProof, generateSignalHash, packToSolidityProof };
10
7
  export * from "./types";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@semaphore-protocol/proof",
3
- "version": "0.2.1",
4
- "description": "A library for generating and verifying Semaphore proofs.",
3
+ "version": "0.3.1",
4
+ "description": "A library to generate and verify Semaphore proofs.",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.node.js",
7
7
  "exports": {
@@ -37,8 +37,8 @@
37
37
  "@ethersproject/bytes": "^5.5.0",
38
38
  "@ethersproject/solidity": "^5.5.0",
39
39
  "@ethersproject/strings": "^5.5.0",
40
- "@semaphore-protocol/identity": "0.2.1",
41
- "@zk-kit/incremental-merkle-tree": "^0.4.3",
40
+ "@semaphore-protocol/group": "0.1.1",
41
+ "@semaphore-protocol/identity": "0.2.2",
42
42
  "circomlibjs": "0.0.8",
43
43
  "snarkjs": "^0.4.13"
44
44
  }
@@ -1,16 +1,25 @@
1
1
  import type { Identity } from "@semaphore-protocol/identity"
2
- import { MerkleProof } from "@zk-kit/incremental-merkle-tree"
2
+ import { Group } from "@semaphore-protocol/group"
3
3
  import { groth16 } from "snarkjs"
4
4
  import generateSignalHash from "./generateSignalHash"
5
5
  import { BigNumberish, FullProof, SnarkArtifacts } from "./types"
6
6
 
7
7
  export default async function generateProof(
8
8
  identity: Identity,
9
- merkleProof: MerkleProof,
9
+ group: Group,
10
10
  externalNullifier: BigNumberish,
11
11
  signal: string,
12
12
  snarkArtifacts: SnarkArtifacts
13
13
  ): Promise<FullProof> {
14
+ const commitment = identity.generateCommitment()
15
+ const index = group.indexOf(commitment)
16
+
17
+ if (index === -1) {
18
+ throw new Error("The identity is not part of the group")
19
+ }
20
+
21
+ const merkleProof = group.generateProofOfMembership(index)
22
+
14
23
  const { proof, publicSignals } = await groth16.fullProve(
15
24
  {
16
25
  identityTrapdoor: identity.getTrapdoor(),
package/src/index.test.ts CHANGED
@@ -1,9 +1,8 @@
1
+ import { Group } from "@semaphore-protocol/group"
1
2
  import { Identity } from "@semaphore-protocol/identity"
2
3
  import download from "download"
3
4
  import { getCurveFromName } from "ffjavascript"
4
5
  import fs from "fs"
5
- import createMerkleProof from "./createMerkleProof"
6
- import createMerkleTree from "./createMerkleTree"
7
6
  import generateNullifierHash from "./generateNullifierHash"
8
7
  import generateProof from "./generateProof"
9
8
  import generateSignalHash from "./generateSignalHash"
@@ -13,13 +12,16 @@ import verifyProof from "./verifyProof"
13
12
 
14
13
  describe("Proof", () => {
15
14
  const treeDepth = 20
15
+
16
16
  const externalNullifier = "1"
17
17
  const signal = "0x111"
18
18
 
19
19
  const snarkArtifactsPath = "./packages/proof/snark-artifacts"
20
20
  const snarkArtifactsUrl = `http://www.trusted-setup-pse.org/semaphore/${treeDepth}`
21
21
 
22
- let identity: Identity
22
+ const identity = new Identity()
23
+ const identityCommitment = identity.generateCommitment()
24
+
23
25
  let fullProof: FullProof
24
26
  let curve: any
25
27
 
@@ -35,55 +37,40 @@ describe("Proof", () => {
35
37
  await download(`${snarkArtifactsUrl}/semaphore.zkey`, snarkArtifactsPath)
36
38
  await download(`${snarkArtifactsUrl}/semaphore.json`, snarkArtifactsPath)
37
39
  }
38
- })
40
+ }, 10000)
39
41
 
40
42
  afterAll(async () => {
41
43
  await curve.terminate()
42
44
  })
43
45
 
44
- describe("# createMerkleTree", () => {
45
- it("Should not generate a Merkle tree with a zero value leaf", async () => {
46
- const fun = () => createMerkleTree(treeDepth, BigInt(0), [BigInt(0), BigInt(1)])
47
-
48
- expect(fun).toThrow("Leaves cannot have zero values")
49
- })
50
-
51
- it("Should generate a Merkle tree", async () => {
52
- const merkleTree = createMerkleTree(treeDepth, BigInt(0), [BigInt(1), BigInt(2)])
53
-
54
- expect(merkleTree.leaves).toHaveLength(2)
55
- })
56
- })
57
-
58
- describe("# createMerkleProof", () => {
59
- it("Should not generate a Merkle proof of a non-existing leaf", async () => {
60
- const fun = () => createMerkleProof(treeDepth, BigInt(0), [BigInt(1), BigInt(2)], BigInt(3))
46
+ describe("# generateProof", () => {
47
+ it("Should not generate Semaphore proofs if the identity is not part of the group", async () => {
48
+ const group = new Group(treeDepth)
61
49
 
62
- expect(fun).toThrow("The leaf does not exist")
63
- })
50
+ group.addMembers([BigInt(1), BigInt(2)])
64
51
 
65
- it("Should generate a Merkle proof", async () => {
66
- const merkleProof = createMerkleProof(treeDepth, BigInt(0), [BigInt(1), BigInt(2)], BigInt(2))
52
+ const fun = () =>
53
+ generateProof(identity, group, externalNullifier, signal, {
54
+ wasmFilePath: `${snarkArtifactsPath}/semaphore.wasm`,
55
+ zkeyFilePath: `${snarkArtifactsPath}/semaphore.zkey`
56
+ })
67
57
 
68
- expect(merkleProof.leaf).toBe(BigInt(2))
58
+ await expect(fun).rejects.toThrow("The identity is not part of the group")
69
59
  })
70
- })
71
60
 
72
- describe("# generateProof", () => {
73
61
  it("Should generate a Semaphore proof", async () => {
74
- identity = new Identity()
75
- const identityCommitment = identity.generateCommitment()
76
- const leaves = [BigInt(3), BigInt(2), identityCommitment, BigInt(4)]
77
- const merkleProof = createMerkleProof(treeDepth, BigInt(0), leaves, identityCommitment)
62
+ const group = new Group(treeDepth)
63
+
64
+ group.addMembers([BigInt(1), BigInt(2), identityCommitment])
78
65
 
79
- fullProof = await generateProof(identity, merkleProof, externalNullifier, signal, {
66
+ fullProof = await generateProof(identity, group, externalNullifier, signal, {
80
67
  wasmFilePath: `${snarkArtifactsPath}/semaphore.wasm`,
81
68
  zkeyFilePath: `${snarkArtifactsPath}/semaphore.zkey`
82
69
  })
83
70
 
84
71
  expect(typeof fullProof).toBe("object")
85
72
  expect(fullProof.publicSignals.externalNullifier).toBe(externalNullifier)
86
- expect(fullProof.publicSignals.merkleRoot).toBe(merkleProof.root.toString())
73
+ expect(fullProof.publicSignals.merkleRoot).toBe(group.root.toString())
87
74
  }, 20000)
88
75
  })
89
76
 
package/src/index.ts CHANGED
@@ -1,20 +1,8 @@
1
- import { MerkleProof } from "@zk-kit/incremental-merkle-tree"
2
- import createMerkleTree from "./createMerkleTree"
3
- import createMerkleProof from "./createMerkleProof"
4
1
  import generateNullifierHash from "./generateNullifierHash"
5
2
  import generateProof from "./generateProof"
6
3
  import verifyProof from "./verifyProof"
7
4
  import generateSignalHash from "./generateSignalHash"
8
5
  import packToSolidityProof from "./packToSolidityProof"
9
6
 
10
- export {
11
- MerkleProof,
12
- createMerkleTree,
13
- createMerkleProof,
14
- generateNullifierHash,
15
- generateProof,
16
- verifyProof,
17
- generateSignalHash,
18
- packToSolidityProof
19
- }
7
+ export { generateNullifierHash, generateProof, verifyProof, generateSignalHash, packToSolidityProof }
20
8
  export * from "./types"
@@ -1,11 +0,0 @@
1
- import { MerkleProof } from "@zk-kit/incremental-merkle-tree";
2
- import { BigNumberish } from "./types";
3
- /**
4
- * Creates a Merkle proof.
5
- * @param depth The depth of the tree.
6
- * @param zeroValue The zero value of the tree.
7
- * @param leaves The list of the leaves of the tree.
8
- * @param leaf The leaf for which Merkle proof should be created.
9
- * @returns The Merkle proof.
10
- */
11
- export default function createMerkleProof(depth: number, zeroValue: BigNumberish, leaves: BigNumberish[], leaf: BigNumberish): MerkleProof;
@@ -1,10 +0,0 @@
1
- import { IncrementalMerkleTree } from "@zk-kit/incremental-merkle-tree";
2
- import { BigNumberish } from "./types";
3
- /**
4
- * Creates a Merkle tree.
5
- * @param depth The depth of the tree.
6
- * @param zeroValue The zero value of the tree.
7
- * @param leaves The list of the leaves of the tree.
8
- * @returns The Merkle tree.
9
- */
10
- export default function createMerkleTree(depth: number, zeroValue: BigNumberish, leaves: BigNumberish[]): IncrementalMerkleTree;
@@ -1,32 +0,0 @@
1
- import { MerkleProof } from "@zk-kit/incremental-merkle-tree"
2
- import createMerkleTree from "./createMerkleTree"
3
- import { BigNumberish } from "./types"
4
-
5
- /**
6
- * Creates a Merkle proof.
7
- * @param depth The depth of the tree.
8
- * @param zeroValue The zero value of the tree.
9
- * @param leaves The list of the leaves of the tree.
10
- * @param leaf The leaf for which Merkle proof should be created.
11
- * @returns The Merkle proof.
12
- */
13
- export default function createMerkleProof(
14
- depth: number,
15
- zeroValue: BigNumberish,
16
- leaves: BigNumberish[],
17
- leaf: BigNumberish
18
- ): MerkleProof {
19
- const tree = createMerkleTree(depth, zeroValue, leaves)
20
-
21
- const leafIndex = tree.leaves.indexOf(BigInt(leaf))
22
-
23
- if (leafIndex === -1) {
24
- throw new Error("The leaf does not exist")
25
- }
26
-
27
- const merkleProof = tree.createProof(leafIndex)
28
-
29
- merkleProof.siblings = merkleProof.siblings.map((s) => s[0])
30
-
31
- return merkleProof
32
- }
@@ -1,28 +0,0 @@
1
- import { IncrementalMerkleTree } from "@zk-kit/incremental-merkle-tree"
2
- import { poseidon } from "circomlibjs"
3
- import { BigNumberish } from "./types"
4
-
5
- /**
6
- * Creates a Merkle tree.
7
- * @param depth The depth of the tree.
8
- * @param zeroValue The zero value of the tree.
9
- * @param leaves The list of the leaves of the tree.
10
- * @returns The Merkle tree.
11
- */
12
- export default function createMerkleTree(
13
- depth: number,
14
- zeroValue: BigNumberish,
15
- leaves: BigNumberish[]
16
- ): IncrementalMerkleTree {
17
- const tree = new IncrementalMerkleTree(poseidon, depth, zeroValue, 2)
18
-
19
- for (const leaf of leaves) {
20
- if (leaf === zeroValue) {
21
- throw new Error("Leaves cannot have zero values")
22
- }
23
-
24
- tree.insert(BigInt(leaf))
25
- }
26
-
27
- return tree
28
- }