@semaphore-protocol/cli 3.2.3 → 3.4.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 (3) hide show
  1. package/dist/index.js +85 -57
  2. package/package.json +2 -2
  3. package/src/index.ts +109 -60
package/dist/index.js CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  /**
4
4
  * @module @semaphore-protocol/cli
5
- * @version 3.2.3
5
+ * @version 3.4.0
6
6
  * @file A command line tool to set up your Semaphore project and get group data.
7
7
  * @copyright Ethereum Foundation 2022
8
8
  * @license MIT
9
9
  * @see [Github]{@link https://github.com/semaphore-protocol/semaphore/tree/main/packages/cli}
10
10
  */
11
11
 
12
- import { SemaphoreSubgraph } from '@semaphore-protocol/data';
12
+ import { SemaphoreSubgraph, SemaphoreEthers } from '@semaphore-protocol/data';
13
13
  import chalk from 'chalk';
14
14
  import { program } from 'commander';
15
15
  import download from 'download';
@@ -72,7 +72,7 @@ class Spinner {
72
72
 
73
73
  const packagePath = `${dirname(fileURLToPath(import.meta.url))}/..`;
74
74
  const { description, version } = JSON.parse(readFileSync(`${packagePath}/package.json`, "utf8"));
75
- const supportedNetworks = ["goerli", "mumbai", "optimism-goerli", "arbitrum"];
75
+ const supportedNetworks = ["sepolia", "goerli", "mumbai", "optimism-goerli", "arbitrum", "arbitrum-goerli"];
76
76
  program
77
77
  .name("semaphore")
78
78
  .description(description)
@@ -129,7 +129,7 @@ program
129
129
  });
130
130
  program
131
131
  .command("get-groups")
132
- .description("Get the list of groups from a supported network (goerli or arbitrum).")
132
+ .description("Get the list of groups from a supported network (e.g. goerli or arbitrum).")
133
133
  .option("-n, --network <network-name>", "Supported Ethereum network.")
134
134
  .allowExcessArguments(false)
135
135
  .action(async ({ network }) => {
@@ -147,27 +147,36 @@ program
147
147
  console.info(`\n ${logSymbols.error}`, `error: the network '${network}' is not supported\n`);
148
148
  return;
149
149
  }
150
- const subgraph = new SemaphoreSubgraph(network);
150
+ let groupIds;
151
151
  const spinner = new Spinner("Fetching groups");
152
152
  spinner.start();
153
153
  try {
154
- const groupIds = await subgraph.getGroupIds();
154
+ const semaphoreSubgraph = new SemaphoreSubgraph(network);
155
+ groupIds = await semaphoreSubgraph.getGroupIds();
155
156
  spinner.stop();
156
- if (groupIds.length === 0) {
157
- console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n");
157
+ }
158
+ catch {
159
+ try {
160
+ const semaphoreEthers = new SemaphoreEthers(network);
161
+ groupIds = await semaphoreEthers.getGroupIds();
162
+ spinner.stop();
163
+ }
164
+ catch {
165
+ spinner.stop();
166
+ console.info(`\n ${logSymbols.error}`, "error: unexpected error with the SemaphoreEthers package");
158
167
  return;
159
168
  }
160
- const content = `\n${groupIds.map((id) => ` - ${id}`).join("\n")}`;
161
- console.info(`${content}\n`);
162
169
  }
163
- catch (error) {
164
- spinner.stop();
165
- console.info(`\n ${logSymbols.error}`, "error: unexpected error with the Semaphore subgraph");
170
+ if (groupIds.length === 0) {
171
+ console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n");
172
+ return;
166
173
  }
174
+ const content = `\n${groupIds.map((id) => ` - ${id}`).join("\n")}`;
175
+ console.info(`${content}\n`);
167
176
  });
168
177
  program
169
178
  .command("get-group")
170
- .description("Get the data of a group from a supported network (Goerli or Arbitrum).")
179
+ .description("Get the data of a group from a supported network (e.g. goerli or arbitrum).")
171
180
  .argument("[group-id]", "Identifier of the group.")
172
181
  .option("-n, --network <network-name>", "Supported Ethereum network.")
173
182
  .option("-m, --members", "Show group members.")
@@ -184,31 +193,42 @@ program
184
193
  });
185
194
  network = selectedNetwork;
186
195
  }
196
+ if (!supportedNetworks.includes(network)) {
197
+ console.info(`\n ${logSymbols.error}`, `error: the network '${network}' is not supported\n`);
198
+ return;
199
+ }
187
200
  if (!groupId) {
188
- const subgraphGroups = new SemaphoreSubgraph(network);
201
+ let groupIds;
189
202
  const spinnerGroups = new Spinner("Fetching groups");
190
203
  spinnerGroups.start();
191
204
  try {
192
- const groups = await subgraphGroups.getGroups();
205
+ const semaphoreSubgraphGroups = new SemaphoreSubgraph(network);
206
+ groupIds = await semaphoreSubgraphGroups.getGroupIds();
193
207
  spinnerGroups.stop();
194
- if (groups.length === 0) {
195
- console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n");
208
+ }
209
+ catch {
210
+ try {
211
+ const semaphoreEthersGroups = new SemaphoreEthers(network);
212
+ groupIds = await semaphoreEthersGroups.getGroupIds();
213
+ spinnerGroups.stop();
214
+ }
215
+ catch {
216
+ spinnerGroups.stop();
217
+ console.info(`\n ${logSymbols.error}`, "error: unexpected error with the SemaphoreEthers package");
196
218
  return;
197
219
  }
198
- const groupIds = groups.map(({ id }) => id);
199
- const { selectedGroupId } = await inquirer.prompt({
200
- name: "selectedGroupId",
201
- type: "list",
202
- message: "Select one of the following existing group ids:",
203
- choices: groupIds
204
- });
205
- groupId = selectedGroupId;
206
220
  }
207
- catch (error) {
208
- spinnerGroups.stop();
209
- console.info(`\n ${logSymbols.error}`, "error: unexpected error with the Semaphore subgraph");
221
+ if (groupIds.length === 0) {
222
+ console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n");
210
223
  return;
211
224
  }
225
+ const { selectedGroupId } = await inquirer.prompt({
226
+ name: "selectedGroupId",
227
+ type: "list",
228
+ message: "Select one of the following existing group ids:",
229
+ choices: groupIds
230
+ });
231
+ groupId = selectedGroupId;
212
232
  }
213
233
  if (!members && !signals) {
214
234
  const { showMembers } = await inquirer.prompt({
@@ -226,42 +246,50 @@ program
226
246
  });
227
247
  signals = showSignals;
228
248
  }
229
- if (!supportedNetworks.includes(network)) {
230
- console.info(`\n ${logSymbols.error}`, `error: the network '${network}' is not supported\n`);
231
- return;
232
- }
233
- const subgraph = new SemaphoreSubgraph(network);
249
+ let group;
234
250
  const spinner = new Spinner(`Fetching group ${groupId}`);
235
251
  spinner.start();
236
252
  try {
237
- const group = await subgraph.getGroup(groupId, { members, verifiedProofs: signals });
253
+ const semaphoreSubgraph = new SemaphoreSubgraph(network);
254
+ group = await semaphoreSubgraph.getGroup(groupId, { members, verifiedProofs: signals });
238
255
  spinner.stop();
239
- if (!group) {
256
+ }
257
+ catch {
258
+ try {
259
+ const semaphoreEthers = new SemaphoreEthers(network);
260
+ group = await semaphoreEthers.getGroup(groupId);
261
+ if (members) {
262
+ group.members = await semaphoreEthers.getGroupMembers(groupId);
263
+ }
264
+ if (signals) {
265
+ group.verifiedProofs = await semaphoreEthers.getGroupVerifiedProofs(groupId);
266
+ }
267
+ group.admin = await semaphoreEthers.getGroupAdmin(groupId);
268
+ spinner.stop();
269
+ }
270
+ catch {
271
+ spinner.stop();
240
272
  console.info(`\n ${logSymbols.error}`, "error: the group does not exist\n");
241
273
  return;
242
274
  }
243
- let content = ` ${chalk.bold("Id")}: ${group.id}\n`;
244
- content += ` ${chalk.bold("Admin")}: ${group.admin}\n`;
245
- content += ` ${chalk.bold("Merkle tree")}:\n`;
246
- content += ` Root: ${group.merkleTree.root}\n`;
247
- content += ` Depth: ${group.merkleTree.depth}\n`;
248
- content += ` Zero value: ${group.merkleTree.zeroValue}\n`;
249
- content += ` Number of leaves: ${group.merkleTree.numberOfLeaves}`;
250
- if (members) {
251
- content += `\n\n ${chalk.bold("Members")}: \n${group.members
252
- .map((member, i) => ` ${i}. ${member}`)
253
- .join("\n")}`;
254
- }
255
- if (signals) {
256
- content += `\n\n ${chalk.bold("Signals")}: \n${group.verifiedProofs
257
- .map(({ signal }) => ` - ${signal}`)
258
- .join("\n")}`;
259
- }
260
- console.info(`\n${content}\n`);
261
275
  }
262
- catch (error) {
263
- spinner.stop();
264
- console.info(`\n ${logSymbols.error}`, "error: unexpected error with the Semaphore subgraph");
276
+ let content = ` ${chalk.bold("Id")}: ${group.id}\n`;
277
+ content += ` ${chalk.bold("Admin")}: ${group.admin}\n`;
278
+ content += ` ${chalk.bold("Merkle tree")}:\n`;
279
+ content += ` Root: ${group.merkleTree.root}\n`;
280
+ content += ` Depth: ${group.merkleTree.depth}\n`;
281
+ content += ` Zero value: ${group.merkleTree.zeroValue}\n`;
282
+ content += ` Number of leaves: ${group.merkleTree.numberOfLeaves}`;
283
+ if (members) {
284
+ content += `\n\n ${chalk.bold("Members")}: \n${group.members
285
+ .map((member, i) => ` ${i}. ${member}`)
286
+ .join("\n")}`;
287
+ }
288
+ if (signals) {
289
+ content += `\n\n ${chalk.bold("Signals")}: \n${group.verifiedProofs
290
+ .map(({ signal }) => ` - ${signal}`)
291
+ .join("\n")}`;
265
292
  }
293
+ console.info(`\n${content}\n`);
266
294
  });
267
295
  program.parse(process.argv);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@semaphore-protocol/cli",
3
3
  "type": "module",
4
- "version": "3.2.3",
4
+ "version": "3.4.0",
5
5
  "description": "A command line tool to set up your Semaphore project and get group data.",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -41,7 +41,7 @@
41
41
  "typedoc": "^0.22.11"
42
42
  },
43
43
  "dependencies": {
44
- "@semaphore-protocol/data": "3.2.3",
44
+ "@semaphore-protocol/data": "3.4.0",
45
45
  "axios": "^1.3.2",
46
46
  "boxen": "^7.0.1",
47
47
  "chalk": "^5.1.2",
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SemaphoreSubgraph } from "@semaphore-protocol/data"
1
+ import { SemaphoreSubgraph, SemaphoreEthers, GroupResponse } from "@semaphore-protocol/data"
2
2
  import chalk from "chalk"
3
3
  import { program } from "commander"
4
4
  import download from "download"
@@ -14,7 +14,7 @@ import Spinner from "./spinner.js"
14
14
  const packagePath = `${dirname(fileURLToPath(import.meta.url))}/..`
15
15
  const { description, version } = JSON.parse(readFileSync(`${packagePath}/package.json`, "utf8"))
16
16
 
17
- const supportedNetworks = ["goerli", "mumbai", "optimism-goerli", "arbitrum"]
17
+ const supportedNetworks = ["sepolia", "goerli", "mumbai", "optimism-goerli", "arbitrum", "arbitrum-goerli"]
18
18
 
19
19
  program
20
20
  .name("semaphore")
@@ -53,6 +53,7 @@ program
53
53
 
54
54
  if (existsSync(projectDirectory)) {
55
55
  console.info(`\n ${logSymbols.error}`, `error: the '${projectDirectory}' folder already exists\n`)
56
+
56
57
  return
57
58
  }
58
59
 
@@ -88,7 +89,7 @@ program
88
89
 
89
90
  program
90
91
  .command("get-groups")
91
- .description("Get the list of groups from a supported network (goerli or arbitrum).")
92
+ .description("Get the list of groups from a supported network (e.g. goerli or arbitrum).")
92
93
  .option("-n, --network <network-name>", "Supported Ethereum network.")
93
94
  .allowExcessArguments(false)
94
95
  .action(async ({ network }) => {
@@ -105,37 +106,51 @@ program
105
106
 
106
107
  if (!supportedNetworks.includes(network)) {
107
108
  console.info(`\n ${logSymbols.error}`, `error: the network '${network}' is not supported\n`)
109
+
108
110
  return
109
111
  }
110
112
 
111
- const subgraph = new SemaphoreSubgraph(network)
113
+ let groupIds: string[]
114
+
112
115
  const spinner = new Spinner("Fetching groups")
113
116
 
114
117
  spinner.start()
115
118
 
116
119
  try {
117
- const groupIds = await subgraph.getGroupIds()
120
+ const semaphoreSubgraph = new SemaphoreSubgraph(network)
121
+
122
+ groupIds = await semaphoreSubgraph.getGroupIds()
118
123
 
119
124
  spinner.stop()
125
+ } catch {
126
+ try {
127
+ const semaphoreEthers = new SemaphoreEthers(network)
128
+
129
+ groupIds = await semaphoreEthers.getGroupIds()
130
+
131
+ spinner.stop()
132
+ } catch {
133
+ spinner.stop()
134
+
135
+ console.info(`\n ${logSymbols.error}`, "error: unexpected error with the SemaphoreEthers package")
120
136
 
121
- if (groupIds.length === 0) {
122
- console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n")
123
137
  return
124
138
  }
139
+ }
140
+ if (groupIds.length === 0) {
141
+ console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n")
125
142
 
126
- const content = `\n${groupIds.map((id: any) => ` - ${id}`).join("\n")}`
143
+ return
144
+ }
127
145
 
128
- console.info(`${content}\n`)
129
- } catch (error) {
130
- spinner.stop()
146
+ const content = `\n${groupIds.map((id: any) => ` - ${id}`).join("\n")}`
131
147
 
132
- console.info(`\n ${logSymbols.error}`, "error: unexpected error with the Semaphore subgraph")
133
- }
148
+ console.info(`${content}\n`)
134
149
  })
135
150
 
136
151
  program
137
152
  .command("get-group")
138
- .description("Get the data of a group from a supported network (Goerli or Arbitrum).")
153
+ .description("Get the data of a group from a supported network (e.g. goerli or arbitrum).")
139
154
  .argument("[group-id]", "Identifier of the group.")
140
155
  .option("-n, --network <network-name>", "Supported Ethereum network.")
141
156
  .option("-m, --members", "Show group members.")
@@ -150,37 +165,59 @@ program
150
165
  default: supportedNetworks[0],
151
166
  choices: supportedNetworks
152
167
  })
168
+
153
169
  network = selectedNetwork
154
170
  }
155
171
 
172
+ if (!supportedNetworks.includes(network)) {
173
+ console.info(`\n ${logSymbols.error}`, `error: the network '${network}' is not supported\n`)
174
+
175
+ return
176
+ }
177
+
156
178
  if (!groupId) {
157
- const subgraphGroups = new SemaphoreSubgraph(network)
179
+ let groupIds: string[]
180
+
158
181
  const spinnerGroups = new Spinner("Fetching groups")
182
+
159
183
  spinnerGroups.start()
184
+
160
185
  try {
161
- const groups = await subgraphGroups.getGroups()
186
+ const semaphoreSubgraphGroups = new SemaphoreSubgraph(network)
187
+
188
+ groupIds = await semaphoreSubgraphGroups.getGroupIds()
162
189
 
163
190
  spinnerGroups.stop()
191
+ } catch {
192
+ try {
193
+ const semaphoreEthersGroups = new SemaphoreEthers(network)
194
+
195
+ groupIds = await semaphoreEthersGroups.getGroupIds()
196
+
197
+ spinnerGroups.stop()
198
+ } catch {
199
+ spinnerGroups.stop()
200
+
201
+ console.info(`\n ${logSymbols.error}`, "error: unexpected error with the SemaphoreEthers package")
164
202
 
165
- if (groups.length === 0) {
166
- console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n")
167
203
  return
168
204
  }
205
+ }
169
206
 
170
- const groupIds = groups.map(({ id }: any) => id)
207
+ if (groupIds.length === 0) {
208
+ console.info(`\n ${logSymbols.info}`, "info: there are no groups in this network\n")
171
209
 
172
- const { selectedGroupId } = await inquirer.prompt({
173
- name: "selectedGroupId",
174
- type: "list",
175
- message: "Select one of the following existing group ids:",
176
- choices: groupIds
177
- })
178
- groupId = selectedGroupId
179
- } catch (error) {
180
- spinnerGroups.stop()
181
- console.info(`\n ${logSymbols.error}`, "error: unexpected error with the Semaphore subgraph")
182
210
  return
183
211
  }
212
+
213
+ const { selectedGroupId } = await inquirer.prompt({
214
+ name: "selectedGroupId",
215
+ type: "list",
216
+ message: "Select one of the following existing group ids:",
217
+ choices: groupIds
218
+ })
219
+
220
+ groupId = selectedGroupId
184
221
  }
185
222
 
186
223
  if (!members && !signals) {
@@ -203,53 +240,65 @@ program
203
240
  signals = showSignals
204
241
  }
205
242
 
206
- if (!supportedNetworks.includes(network)) {
207
- console.info(`\n ${logSymbols.error}`, `error: the network '${network}' is not supported\n`)
208
- return
209
- }
243
+ let group: GroupResponse
210
244
 
211
- const subgraph = new SemaphoreSubgraph(network)
212
245
  const spinner = new Spinner(`Fetching group ${groupId}`)
213
246
 
214
247
  spinner.start()
215
248
 
216
249
  try {
217
- const group = await subgraph.getGroup(groupId, { members, verifiedProofs: signals })
250
+ const semaphoreSubgraph = new SemaphoreSubgraph(network)
251
+
252
+ group = await semaphoreSubgraph.getGroup(groupId, { members, verifiedProofs: signals })
218
253
 
219
254
  spinner.stop()
255
+ } catch {
256
+ try {
257
+ const semaphoreEthers = new SemaphoreEthers(network)
220
258
 
221
- if (!group) {
222
- console.info(`\n ${logSymbols.error}`, "error: the group does not exist\n")
259
+ group = await semaphoreEthers.getGroup(groupId)
223
260
 
224
- return
225
- }
261
+ if (members) {
262
+ group.members = await semaphoreEthers.getGroupMembers(groupId)
263
+ }
226
264
 
227
- let content = ` ${chalk.bold("Id")}: ${group.id}\n`
228
- content += ` ${chalk.bold("Admin")}: ${group.admin}\n`
229
- content += ` ${chalk.bold("Merkle tree")}:\n`
230
- content += ` Root: ${group.merkleTree.root}\n`
231
- content += ` Depth: ${group.merkleTree.depth}\n`
232
- content += ` Zero value: ${group.merkleTree.zeroValue}\n`
233
- content += ` Number of leaves: ${group.merkleTree.numberOfLeaves}`
234
-
235
- if (members) {
236
- content += `\n\n ${chalk.bold("Members")}: \n${group.members
237
- .map((member: string, i: number) => ` ${i}. ${member}`)
238
- .join("\n")}`
239
- }
265
+ if (signals) {
266
+ group.verifiedProofs = await semaphoreEthers.getGroupVerifiedProofs(groupId)
267
+ }
268
+
269
+ group.admin = await semaphoreEthers.getGroupAdmin(groupId)
270
+
271
+ spinner.stop()
272
+ } catch {
273
+ spinner.stop()
240
274
 
241
- if (signals) {
242
- content += `\n\n ${chalk.bold("Signals")}: \n${group.verifiedProofs
243
- .map(({ signal }: any) => ` - ${signal}`)
244
- .join("\n")}`
275
+ console.info(`\n ${logSymbols.error}`, "error: the group does not exist\n")
276
+
277
+ return
245
278
  }
279
+ }
246
280
 
247
- console.info(`\n${content}\n`)
248
- } catch (error) {
249
- spinner.stop()
281
+ let content = ` ${chalk.bold("Id")}: ${group.id}\n`
282
+ content += ` ${chalk.bold("Admin")}: ${group.admin}\n`
283
+ content += ` ${chalk.bold("Merkle tree")}:\n`
284
+ content += ` Root: ${group.merkleTree.root}\n`
285
+ content += ` Depth: ${group.merkleTree.depth}\n`
286
+ content += ` Zero value: ${group.merkleTree.zeroValue}\n`
287
+ content += ` Number of leaves: ${group.merkleTree.numberOfLeaves}`
288
+
289
+ if (members) {
290
+ content += `\n\n ${chalk.bold("Members")}: \n${group.members
291
+ .map((member: string, i: number) => ` ${i}. ${member}`)
292
+ .join("\n")}`
293
+ }
250
294
 
251
- console.info(`\n ${logSymbols.error}`, "error: unexpected error with the Semaphore subgraph")
295
+ if (signals) {
296
+ content += `\n\n ${chalk.bold("Signals")}: \n${group.verifiedProofs
297
+ .map(({ signal }: any) => ` - ${signal}`)
298
+ .join("\n")}`
252
299
  }
300
+
301
+ console.info(`\n${content}\n`)
253
302
  })
254
303
 
255
304
  program.parse(process.argv)