@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.
- package/dist/index.js +85 -57
- package/package.json +2 -2
- 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.
|
|
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
|
-
|
|
150
|
+
let groupIds;
|
|
151
151
|
const spinner = new Spinner("Fetching groups");
|
|
152
152
|
spinner.start();
|
|
153
153
|
try {
|
|
154
|
-
const
|
|
154
|
+
const semaphoreSubgraph = new SemaphoreSubgraph(network);
|
|
155
|
+
groupIds = await semaphoreSubgraph.getGroupIds();
|
|
155
156
|
spinner.stop();
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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 (
|
|
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
|
-
|
|
201
|
+
let groupIds;
|
|
189
202
|
const spinnerGroups = new Spinner("Fetching groups");
|
|
190
203
|
spinnerGroups.start();
|
|
191
204
|
try {
|
|
192
|
-
const
|
|
205
|
+
const semaphoreSubgraphGroups = new SemaphoreSubgraph(network);
|
|
206
|
+
groupIds = await semaphoreSubgraphGroups.getGroupIds();
|
|
193
207
|
spinnerGroups.stop();
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
|
253
|
+
const semaphoreSubgraph = new SemaphoreSubgraph(network);
|
|
254
|
+
group = await semaphoreSubgraph.getGroup(groupId, { members, verifiedProofs: signals });
|
|
238
255
|
spinner.stop();
|
|
239
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
143
|
+
return
|
|
144
|
+
}
|
|
127
145
|
|
|
128
|
-
|
|
129
|
-
} catch (error) {
|
|
130
|
-
spinner.stop()
|
|
146
|
+
const content = `\n${groupIds.map((id: any) => ` - ${id}`).join("\n")}`
|
|
131
147
|
|
|
132
|
-
|
|
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 (
|
|
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
|
-
|
|
179
|
+
let groupIds: string[]
|
|
180
|
+
|
|
158
181
|
const spinnerGroups = new Spinner("Fetching groups")
|
|
182
|
+
|
|
159
183
|
spinnerGroups.start()
|
|
184
|
+
|
|
160
185
|
try {
|
|
161
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
222
|
-
console.info(`\n ${logSymbols.error}`, "error: the group does not exist\n")
|
|
259
|
+
group = await semaphoreEthers.getGroup(groupId)
|
|
223
260
|
|
|
224
|
-
|
|
225
|
-
|
|
261
|
+
if (members) {
|
|
262
|
+
group.members = await semaphoreEthers.getGroupMembers(groupId)
|
|
263
|
+
}
|
|
226
264
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
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)
|