@maci-protocol/cli 0.0.0-ci.044d30d → 0.0.0-ci.04d05b3
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/LICENSE +1 -2
- package/build/package.json +6 -6
- package/build/ts/index.js +278 -253
- package/build/ts/index.js.map +1 -1
- package/build/ts/utils/constants.d.ts +2 -0
- package/build/ts/utils/constants.d.ts.map +1 -1
- package/build/ts/utils/constants.js +7 -1
- package/build/ts/utils/constants.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -10
package/build/ts/index.js
CHANGED
|
@@ -45,6 +45,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
45
45
|
const path_1 = __importDefault(require("path"));
|
|
46
46
|
require("./cliInit");
|
|
47
47
|
const utils_1 = require("./utils");
|
|
48
|
+
const constants_1 = require("./utils/constants");
|
|
48
49
|
const defaults_1 = require("./utils/defaults");
|
|
49
50
|
// set the description version and name of the cli tool
|
|
50
51
|
const { description, version, name } = JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(__dirname, "..", "package.json"), "utf8"));
|
|
@@ -66,25 +67,25 @@ program
|
|
|
66
67
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
67
68
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
68
69
|
.requiredOption("-s, --stateTreeDepth <stateTreeDepth>", "the state tree depth", parseInt)
|
|
69
|
-
.action(async (
|
|
70
|
+
.action(async (args) => {
|
|
70
71
|
try {
|
|
71
72
|
const signer = await getSigner();
|
|
72
|
-
(0, utils_1.banner)(
|
|
73
|
+
(0, utils_1.banner)(args.quiet);
|
|
73
74
|
const network = await signer.provider?.getNetwork();
|
|
74
75
|
const [poseidonT3, poseidonT4, poseidonT5, poseidonT6] = (0, utils_1.readContractAddresses)({
|
|
75
76
|
contractNames: [sdk_1.EContracts.PoseidonT3, sdk_1.EContracts.PoseidonT4, sdk_1.EContracts.PoseidonT5, sdk_1.EContracts.PoseidonT6],
|
|
76
77
|
network: network?.name,
|
|
77
78
|
});
|
|
78
79
|
let [signupPolicyContractAddress] = (0, utils_1.readContractAddresses)({
|
|
79
|
-
contractNames: [
|
|
80
|
+
contractNames: [args.signupPolicyContractName.toString()],
|
|
80
81
|
network: network?.name,
|
|
81
82
|
});
|
|
82
83
|
if (!signupPolicyContractAddress) {
|
|
83
|
-
const checkerFactory =
|
|
84
|
-
? sdk_1.FreeForAllCheckerFactory__factory.connect(
|
|
84
|
+
const checkerFactory = args.freeForAllCheckerFactoryAddress
|
|
85
|
+
? sdk_1.FreeForAllCheckerFactory__factory.connect(args.freeForAllCheckerFactoryAddress, signer)
|
|
85
86
|
: undefined;
|
|
86
|
-
const policyFactory =
|
|
87
|
-
? sdk_1.FreeForAllPolicyFactory__factory.connect(
|
|
87
|
+
const policyFactory = args.freeForAllPolicyFactoryAddress
|
|
88
|
+
? sdk_1.FreeForAllPolicyFactory__factory.connect(args.freeForAllPolicyFactoryAddress, signer)
|
|
88
89
|
: undefined;
|
|
89
90
|
const [contract] = await (0, sdk_1.deployFreeForAllSignUpPolicy)({ checker: checkerFactory, policy: policyFactory }, signer, true);
|
|
90
91
|
signupPolicyContractAddress = await contract.getAddress();
|
|
@@ -102,13 +103,13 @@ program
|
|
|
102
103
|
poseidonT6,
|
|
103
104
|
},
|
|
104
105
|
signer,
|
|
105
|
-
stateTreeDepth:
|
|
106
|
+
stateTreeDepth: args.stateTreeDepth,
|
|
106
107
|
});
|
|
107
|
-
const emptyBallotRoots = (0, sdk_1.
|
|
108
|
+
const emptyBallotRoots = (0, sdk_1.generateEmptyBallotRoots)(args.stateTreeDepth);
|
|
108
109
|
// save to the JSON File
|
|
109
110
|
await (0, utils_1.storeContractAddresses)({
|
|
110
111
|
data: {
|
|
111
|
-
[
|
|
112
|
+
[args.signupPolicyContractName]: { address: signupPolicyContractAddress, args: [] },
|
|
112
113
|
[sdk_1.EContracts.Verifier]: { address: verifierContractAddress, args: [] },
|
|
113
114
|
[sdk_1.EContracts.MACI]: {
|
|
114
115
|
address: maciContractAddress,
|
|
@@ -117,7 +118,7 @@ program
|
|
|
117
118
|
messageProcessorFactoryContractAddress,
|
|
118
119
|
tallyFactoryContractAddress,
|
|
119
120
|
signupPolicyContractAddress,
|
|
120
|
-
|
|
121
|
+
args.stateTreeDepth,
|
|
121
122
|
emptyBallotRoots.map((root) => root.toString()),
|
|
122
123
|
],
|
|
123
124
|
},
|
|
@@ -131,7 +132,7 @@ program
|
|
|
131
132
|
},
|
|
132
133
|
signer,
|
|
133
134
|
});
|
|
134
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
135
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`MACI deployed at: ${maciContractAddress}`) });
|
|
135
136
|
}
|
|
136
137
|
catch (error) {
|
|
137
138
|
program.error(error.message, { exitCode: 1 });
|
|
@@ -140,75 +141,81 @@ program
|
|
|
140
141
|
program
|
|
141
142
|
.command("checkVerifyingKeys")
|
|
142
143
|
.description("check that the verifying keys in the contract match the local ones")
|
|
143
|
-
.option("-
|
|
144
|
+
.option("-m, --mode <mode>", "Voting mode (qv, non-qv, full)", (value) => constants_1.MODE_NAME_TO_ENUM[value], sdk_1.EMode.QV)
|
|
144
145
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
145
146
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
146
|
-
.option("-k, --vk-contract <vkContract>", "the
|
|
147
|
+
.option("-k, --vk-contract <vkContract>", "the VerifyingKeysRegistry contract address")
|
|
147
148
|
.requiredOption("-s, --state-tree-depth <stateTreeDepth>", "the state tree depth", parseInt)
|
|
148
|
-
.requiredOption("-i, --
|
|
149
|
+
.requiredOption("-i, --tally-processing-state-tree-depth <tallyProcessingStateTreeDepth>", "the intermediate state tree depth", parseInt)
|
|
149
150
|
.requiredOption("-v, --vote-option-tree-depth <voteOptionTreeDepth>", "the vote option tree depth", parseInt)
|
|
150
|
-
.requiredOption("-b, --
|
|
151
|
-
.requiredOption("-p, --
|
|
152
|
-
.requiredOption("-t, --tally-
|
|
151
|
+
.requiredOption("-b, --message-batch-size <messageBatchSize>", "the message batch size", parseInt)
|
|
152
|
+
.requiredOption("-p, --message-processor-zkey <messageProcessorZkeyPath>", "the message processor zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
153
|
+
.requiredOption("-t, --vote-tally-zkey <voteTallyZkeyPath>", "the vote tally zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
153
154
|
.requiredOption("--poll-joining-zkey <pollJoiningZkey>", "the poll joining zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
154
155
|
.requiredOption("--poll-joined-zkey <pollJoinedZkey>", "the poll joined zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
155
|
-
.action(async (
|
|
156
|
+
.action(async (args) => {
|
|
156
157
|
try {
|
|
157
158
|
const signer = await getSigner();
|
|
158
159
|
const network = await signer.provider?.getNetwork();
|
|
159
|
-
const [
|
|
160
|
-
contractNames: [sdk_1.EContracts.
|
|
160
|
+
const [contractAddress] = (0, utils_1.readContractAddresses)({
|
|
161
|
+
contractNames: [sdk_1.EContracts.VerifyingKeysRegistry],
|
|
161
162
|
network: network?.name,
|
|
162
|
-
defaultAddresses: [
|
|
163
|
+
defaultAddresses: [args.vkContract],
|
|
163
164
|
});
|
|
164
|
-
(0, sdk_1.logYellow)({ quiet:
|
|
165
|
+
(0, sdk_1.logYellow)({ quiet: args.quiet, text: (0, sdk_1.info)("Retrieving verifying keys from the contract...") });
|
|
165
166
|
await (0, sdk_1.checkVerifyingKeys)({
|
|
166
|
-
stateTreeDepth:
|
|
167
|
-
|
|
168
|
-
voteOptionTreeDepth:
|
|
169
|
-
messageBatchSize:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
pollJoiningZkeyPath:
|
|
173
|
-
pollJoinedZkeyPath:
|
|
174
|
-
|
|
175
|
-
|
|
167
|
+
stateTreeDepth: args.stateTreeDepth,
|
|
168
|
+
tallyProcessingStateTreeDepth: args.tallyProcessingStateTreeDepth,
|
|
169
|
+
voteOptionTreeDepth: args.voteOptionTreeDepth,
|
|
170
|
+
messageBatchSize: args.messageBatchSize,
|
|
171
|
+
messageProcessorZkeyPath: args.messageProcessorZkey,
|
|
172
|
+
voteTallyZkeyPath: args.voteTallyZkey,
|
|
173
|
+
pollJoiningZkeyPath: args.pollJoiningZkey,
|
|
174
|
+
pollJoinedZkeyPath: args.pollJoinedZkey,
|
|
175
|
+
verifyingKeysRegistry: contractAddress,
|
|
176
|
+
mode: args.mode,
|
|
176
177
|
signer,
|
|
177
178
|
});
|
|
178
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
179
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)("Verifying keys match") });
|
|
179
180
|
}
|
|
180
181
|
catch (error) {
|
|
181
182
|
program.error(error.message, { exitCode: 1 });
|
|
182
183
|
}
|
|
183
184
|
});
|
|
184
185
|
program
|
|
185
|
-
.command("
|
|
186
|
+
.command("generateMaciPubKey")
|
|
186
187
|
.description("generate a new MACI public key")
|
|
187
|
-
.requiredOption("-k, --
|
|
188
|
+
.requiredOption("-k, --private-key <privateKey>", "the private key")
|
|
188
189
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
189
190
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
190
|
-
.action((
|
|
191
|
-
const publicKey = (0, sdk_1.generateMaciPublicKey)(
|
|
192
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
191
|
+
.action((args) => {
|
|
192
|
+
const publicKey = (0, sdk_1.generateMaciPublicKey)(args.privateKey);
|
|
193
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Public key: ${publicKey}`) });
|
|
193
194
|
});
|
|
194
195
|
program
|
|
195
|
-
.command("
|
|
196
|
+
.command("generateMaciKeyPair")
|
|
196
197
|
.description("generate a new MACI key pair")
|
|
197
198
|
.option("-s, --seed <seed>", "seed value for keypair", (value) => (value ? BigInt(value) : undefined), undefined)
|
|
198
199
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
199
|
-
.action((
|
|
200
|
-
const { publicKey, privateKey } = (0, sdk_1.generateKeypair)({ seed:
|
|
201
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
202
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
200
|
+
.action((args) => {
|
|
201
|
+
const { publicKey, privateKey, publicKeyAsContractParam } = (0, sdk_1.generateKeypair)({ seed: args.seed });
|
|
202
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Public key: ${publicKey}`) });
|
|
203
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Private key: ${privateKey}`) });
|
|
204
|
+
(0, sdk_1.logGreen)({
|
|
205
|
+
quiet: args.quiet,
|
|
206
|
+
text: (0, sdk_1.success)(`Public key as contract param:
|
|
207
|
+
X: ${publicKeyAsContractParam.x}
|
|
208
|
+
Y: ${publicKeyAsContractParam.y}`),
|
|
209
|
+
});
|
|
203
210
|
});
|
|
204
211
|
program
|
|
205
|
-
.command("
|
|
212
|
+
.command("deployVerifyingKeysRegistry")
|
|
206
213
|
.description("deploy a new verification key registry contract")
|
|
207
214
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
208
215
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
209
|
-
.action(async (
|
|
216
|
+
.action(async (args) => {
|
|
210
217
|
try {
|
|
211
|
-
(0, utils_1.banner)(
|
|
218
|
+
(0, utils_1.banner)(args.quiet);
|
|
212
219
|
const signer = await getSigner();
|
|
213
220
|
// assume that the vkRegistry contract is the first one to be deployed
|
|
214
221
|
const isContractAddressesStoreExists = fs_1.default.existsSync(utils_1.contractAddressesStorePath);
|
|
@@ -217,12 +224,15 @@ program
|
|
|
217
224
|
(0, utils_1.resetContractAddresses)(network?.name);
|
|
218
225
|
}
|
|
219
226
|
// deploy and store the address
|
|
220
|
-
const
|
|
227
|
+
const verifyingKeysRegistryAddress = await (0, sdk_1.deployVerifyingKeysRegistryContract)({ signer });
|
|
221
228
|
await (0, utils_1.storeContractAddresses)({
|
|
222
|
-
data: { [sdk_1.EContracts.
|
|
229
|
+
data: { [sdk_1.EContracts.VerifyingKeysRegistry]: { address: verifyingKeysRegistryAddress, args: [] } },
|
|
223
230
|
signer,
|
|
224
231
|
});
|
|
225
|
-
(0, sdk_1.logGreen)({
|
|
232
|
+
(0, sdk_1.logGreen)({
|
|
233
|
+
quiet: args.quiet,
|
|
234
|
+
text: (0, sdk_1.success)(`VerifyingKeysRegistry deployed at: ${verifyingKeysRegistryAddress}`),
|
|
235
|
+
});
|
|
226
236
|
}
|
|
227
237
|
catch (error) {
|
|
228
238
|
program.error(error.message, { exitCode: 1 });
|
|
@@ -249,37 +259,37 @@ program
|
|
|
249
259
|
program
|
|
250
260
|
.command("deployPoll")
|
|
251
261
|
.description("deploy a new poll")
|
|
252
|
-
.option("-k, --
|
|
253
|
-
.requiredOption("
|
|
254
|
-
.requiredOption("
|
|
255
|
-
.requiredOption("-i, --
|
|
256
|
-
.requiredOption("-b, --
|
|
262
|
+
.option("-k, --verifyingKeysRegistryAddress <verifyingKeysRegistryAddress>", "the vk registry contract address")
|
|
263
|
+
.requiredOption("--start <pollStartDate>", "the poll start date", parseInt)
|
|
264
|
+
.requiredOption("--end <pollEndDate>", "the poll end date", parseInt)
|
|
265
|
+
.requiredOption("-i, --tally-processing-state-tree-depth <tallyProcessingStateTreeDepth>", "the int state tree depth", parseInt)
|
|
266
|
+
.requiredOption("-b, --message-batch-size <messageBatchSize>", "the message batch size", parseInt)
|
|
257
267
|
.requiredOption("-s, --state-tree-depth <stateTreeDepth>", "the state tree depth", parseInt)
|
|
258
268
|
.requiredOption("-v, --vote-option-tree-depth <voteOptionTreeDepth>", "the vote option tree depth", parseInt)
|
|
259
|
-
.requiredOption("-p, --
|
|
260
|
-
.option("-
|
|
269
|
+
.requiredOption("-p, --public-key <publicKey>", "the coordinator public key")
|
|
270
|
+
.option("-m, --mode <mode>", "Voting mode (qv, non-qv, full)", (value) => constants_1.MODE_NAME_TO_ENUM[value], sdk_1.EMode.QV)
|
|
261
271
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
262
|
-
.option("
|
|
272
|
+
.option("--relayers <relayers>", "the relayer addresses", (value) => value.split(",").map((item) => item.trim()))
|
|
263
273
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
264
274
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
265
275
|
.option("-o, --vote-options <voteOptions>", "the number of vote options", parseInt)
|
|
266
276
|
.option("--initial-voice-credits <initialVoiceCredits>", "the initial voice credits", parseInt)
|
|
267
277
|
.option("--initial-voice-credits-proxy <initialVoiceCreditsProxy>", "the initial voice credits proxy address")
|
|
268
278
|
.option("--signup-policy <signupPolicy>", "the signup policy contract address")
|
|
269
|
-
.action(async (
|
|
279
|
+
.action(async (args) => {
|
|
270
280
|
try {
|
|
271
|
-
(0, utils_1.banner)(
|
|
281
|
+
(0, utils_1.banner)(args.quiet);
|
|
272
282
|
const signer = await getSigner();
|
|
273
283
|
const network = await signer.provider?.getNetwork();
|
|
274
|
-
const [
|
|
284
|
+
const [verifyingKeysRegistryAddress, maciAddress, initialVoiceCreditProxyAddress, verifierContractAddress] = (0, utils_1.readContractAddresses)({
|
|
275
285
|
contractNames: [
|
|
276
|
-
sdk_1.EContracts.
|
|
286
|
+
sdk_1.EContracts.VerifyingKeysRegistry,
|
|
277
287
|
sdk_1.EContracts.MACI,
|
|
278
288
|
sdk_1.EContracts.ConstantInitialVoiceCreditProxy,
|
|
279
289
|
sdk_1.EContracts.Verifier,
|
|
280
290
|
],
|
|
281
291
|
network: network?.name,
|
|
282
|
-
defaultAddresses: [
|
|
292
|
+
defaultAddresses: [args.verifyingKeysRegistryAddress, args.maciAddress, args.initialVoiceCreditsProxy],
|
|
283
293
|
});
|
|
284
294
|
const maciContract = sdk_1.MACI__factory.connect(maciAddress, signer);
|
|
285
295
|
const nextPollId = await maciContract.nextPollId();
|
|
@@ -289,40 +299,40 @@ program
|
|
|
289
299
|
contractNames: [policyContractName.toString()],
|
|
290
300
|
keys: [nextPollId.toString()],
|
|
291
301
|
network: network?.name,
|
|
292
|
-
defaultAddresses: [
|
|
302
|
+
defaultAddresses: [args.signupPolicy],
|
|
293
303
|
});
|
|
294
304
|
const { pollId, pollContractAddress, tallyContractAddress, messageProcessorContractAddress, initialVoiceCreditProxyContractAddress, policyContractAddress, } = await (0, sdk_1.deployPoll)({
|
|
295
|
-
initialVoiceCredits:
|
|
296
|
-
pollStartTimestamp:
|
|
297
|
-
pollEndTimestamp:
|
|
298
|
-
|
|
299
|
-
messageBatchSize:
|
|
300
|
-
stateTreeDepth:
|
|
301
|
-
voteOptionTreeDepth:
|
|
302
|
-
|
|
305
|
+
initialVoiceCredits: args.initialVoiceCredits || defaults_1.DEFAULT_INITIAL_VOICE_CREDITS,
|
|
306
|
+
pollStartTimestamp: args.start,
|
|
307
|
+
pollEndTimestamp: args.end,
|
|
308
|
+
tallyProcessingStateTreeDepth: args.tallyProcessingStateTreeDepth,
|
|
309
|
+
messageBatchSize: args.messageBatchSize,
|
|
310
|
+
stateTreeDepth: args.stateTreeDepth,
|
|
311
|
+
voteOptionTreeDepth: args.voteOptionTreeDepth,
|
|
312
|
+
coordinatorPublicKey: domainobjs_1.PublicKey.deserialize(args.publicKey),
|
|
303
313
|
maciAddress,
|
|
304
|
-
|
|
305
|
-
relayers:
|
|
306
|
-
mode:
|
|
314
|
+
verifyingKeysRegistryContractAddress: verifyingKeysRegistryAddress,
|
|
315
|
+
relayers: args.relayers ?? [ethers_1.ZeroAddress],
|
|
316
|
+
mode: args.mode,
|
|
307
317
|
signer,
|
|
308
|
-
voteOptions:
|
|
318
|
+
voteOptions: args.voteOptions ?? defaults_1.DEFAULT_VOTE_OPTIONS,
|
|
309
319
|
verifierContractAddress,
|
|
310
320
|
policyContractAddress: signupPolicyContractAddress,
|
|
311
321
|
initialVoiceCreditProxyContractAddress: initialVoiceCreditProxyAddress,
|
|
312
322
|
});
|
|
313
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
314
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
315
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
323
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Poll ID: ${pollId}`) });
|
|
324
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Poll contract address: ${pollContractAddress}`) });
|
|
325
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Tally contract address: ${tallyContractAddress}`) });
|
|
316
326
|
(0, sdk_1.logGreen)({
|
|
317
|
-
quiet:
|
|
327
|
+
quiet: args.quiet,
|
|
318
328
|
text: (0, sdk_1.success)(`Message processor contract address: ${messageProcessorContractAddress}`),
|
|
319
329
|
});
|
|
320
330
|
(0, sdk_1.logGreen)({
|
|
321
|
-
quiet:
|
|
331
|
+
quiet: args.quiet,
|
|
322
332
|
text: (0, sdk_1.success)(`Initial voice credit proxy contract address: ${initialVoiceCreditProxyContractAddress}`),
|
|
323
333
|
});
|
|
324
334
|
(0, sdk_1.logGreen)({
|
|
325
|
-
quiet:
|
|
335
|
+
quiet: args.quiet,
|
|
326
336
|
text: (0, sdk_1.success)(`Signup policy contract address: ${policyContractAddress}`),
|
|
327
337
|
});
|
|
328
338
|
}
|
|
@@ -333,8 +343,7 @@ program
|
|
|
333
343
|
program
|
|
334
344
|
.command("joinPoll")
|
|
335
345
|
.description("join the poll")
|
|
336
|
-
.requiredOption("-k, --
|
|
337
|
-
.option("-i, --state-index <stateIndex>", "the user's state index", BigInt)
|
|
346
|
+
.requiredOption("-k, --private-key <privateKey>", "the private key")
|
|
338
347
|
.option("-s, --sg-data <sgData>", "the signup policy data")
|
|
339
348
|
.option("-v, --ivcp-data <ivcpData>", "the initial voice credit proxy data")
|
|
340
349
|
.option("-n, --new-voice-credit-balance <newVoiceCreditBalance>", "the voice credit balance of the user for the poll", BigInt)
|
|
@@ -350,38 +359,37 @@ program
|
|
|
350
359
|
.requiredOption("--poll-joining-zkey <pollZkeyPath>", "the poll join zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
351
360
|
.option("-w, --wasm", "whether to use the wasm binaries")
|
|
352
361
|
.option("-r, --rapidsnark <rapidsnark>", "the path to the rapidsnark binary")
|
|
353
|
-
.option("-g, --poll-
|
|
354
|
-
.action(async (
|
|
362
|
+
.option("-g, --poll-witness-generator <pollWitnessGenerator>", "the path to the poll witness generation binary")
|
|
363
|
+
.action(async (args) => {
|
|
355
364
|
try {
|
|
356
365
|
const signer = await getSigner();
|
|
357
366
|
const network = await signer.provider?.getNetwork();
|
|
358
367
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
359
368
|
contractNames: [sdk_1.EContracts.MACI],
|
|
360
369
|
network: network?.name,
|
|
361
|
-
defaultAddresses: [
|
|
370
|
+
defaultAddresses: [args.maciAddress],
|
|
362
371
|
});
|
|
363
|
-
const privateKey =
|
|
372
|
+
const privateKey = args.privateKey || (await (0, utils_1.promptSensitiveValue)("Insert your MACI private key"));
|
|
364
373
|
const data = await (0, sdk_1.joinPoll)({
|
|
365
374
|
maciAddress,
|
|
366
375
|
privateKey,
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
pollId: cmdObj.pollId,
|
|
376
|
+
stateFile: args.stateFile,
|
|
377
|
+
pollId: args.pollId,
|
|
370
378
|
signer,
|
|
371
|
-
startBlock:
|
|
372
|
-
endBlock:
|
|
373
|
-
blocksPerBatch:
|
|
374
|
-
pollJoiningZkey:
|
|
375
|
-
pollWasm:
|
|
376
|
-
useWasm:
|
|
377
|
-
rapidsnark:
|
|
378
|
-
|
|
379
|
-
sgDataArg:
|
|
380
|
-
ivcpDataArg:
|
|
381
|
-
});
|
|
382
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
383
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
384
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
379
|
+
startBlock: args.startBlock,
|
|
380
|
+
endBlock: args.endBlock,
|
|
381
|
+
blocksPerBatch: args.blocksPerBatch,
|
|
382
|
+
pollJoiningZkey: args.pollJoiningZkey,
|
|
383
|
+
pollWasm: args.pollWasm,
|
|
384
|
+
useWasm: args.wasm,
|
|
385
|
+
rapidsnark: args.rapidsnark,
|
|
386
|
+
pollWitnessGenerator: args.pollWitnessGenerator,
|
|
387
|
+
sgDataArg: args.sgData ?? utils_1.DEFAULT_SG_DATA,
|
|
388
|
+
ivcpDataArg: args.ivcpData ?? utils_1.DEFAULT_IVCP_DATA,
|
|
389
|
+
});
|
|
390
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.info)(`User joined poll with nullifier: ${data.nullifier}`) });
|
|
391
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.info)(`User joined poll with state index: ${data.pollStateIndex}`) });
|
|
392
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.info)(`User joined poll with ${data.voiceCredits} voice credits`) });
|
|
385
393
|
}
|
|
386
394
|
catch (error) {
|
|
387
395
|
program.error(error.message, { exitCode: 1 });
|
|
@@ -391,49 +399,59 @@ program
|
|
|
391
399
|
.command("setVerifyingKeys")
|
|
392
400
|
.description("set the verifying keys")
|
|
393
401
|
.requiredOption("-s, --state-tree-depth <stateTreeDepth>", "the state tree depth", parseInt)
|
|
394
|
-
.requiredOption("-i, --
|
|
402
|
+
.requiredOption("-i, --tally-processing-state-tree-depth <tallyProcessingStateTreeDepth>", "the intermediate state tree depth", parseInt)
|
|
395
403
|
.requiredOption("-v, --vote-option-tree-depth <voteOptionTreeDepth>", "the vote option tree depth", parseInt)
|
|
396
|
-
.requiredOption("-b, --
|
|
404
|
+
.requiredOption("-b, --message-batch-size <messageBatchSize>", "the message batch size", parseInt)
|
|
397
405
|
.option("--poll-state-tree-depth <pollStateTreeDepth>", "the poll state tree depth", parseInt)
|
|
398
406
|
.option("--poll-joining-zkey <pollJoiningZkeyPath>", "the poll joining zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
399
407
|
.option("--poll-joined-zkey <pollJoinedZkeyPath>", "the poll joined zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
400
|
-
.option("--
|
|
401
|
-
.option("--tally-
|
|
402
|
-
.option("--
|
|
403
|
-
.option("--tally-
|
|
404
|
-
.option("
|
|
408
|
+
.option("--message-processor-zkey-qv <messageProcessorZkeyPathQv>", "the message processor qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
409
|
+
.option("--vote-tally-zkey-qv <voteTallyZkeyPathQv>", "the vote tally qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
410
|
+
.option("--message-processor-zkey-non-qv <messageProcessorZkeyPathNonQv>", "the message processor non-qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
411
|
+
.option("--vote-tally-zkey-non-qv <voteTallyZkeyPathNonQv>", "the vote tally non-qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
412
|
+
.option("--message-processor-zkey-full <messageProcessorZkeyPathFull>", "the message processor full zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
413
|
+
.option("--vote-tally-zkey-full <tallyVotesZkeyPathFull>", "the vote tally full zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
414
|
+
.option("-m, --mode <mode>", "Voting mode (qv, non-qv, full)", (value) => constants_1.MODE_NAME_TO_ENUM[value], sdk_1.EMode.QV)
|
|
405
415
|
.option("-k, --vk-registry <vkRegistry>", "the vk registry contract address")
|
|
406
416
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
407
417
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
408
|
-
.action(async (
|
|
418
|
+
.action(async (args) => {
|
|
409
419
|
try {
|
|
410
420
|
const signer = await getSigner();
|
|
411
421
|
const network = await signer.provider?.getNetwork();
|
|
412
|
-
const [
|
|
413
|
-
contractNames: [sdk_1.EContracts.
|
|
422
|
+
const [verifyingKeysRegistryAddress] = (0, utils_1.readContractAddresses)({
|
|
423
|
+
contractNames: [sdk_1.EContracts.VerifyingKeysRegistry],
|
|
414
424
|
network: network?.name,
|
|
415
|
-
defaultAddresses: [
|
|
425
|
+
defaultAddresses: [args.vkRegistry],
|
|
416
426
|
});
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
427
|
+
const processKeys = {
|
|
428
|
+
[sdk_1.EMode.QV]: args.messageProcessorZkeyQv,
|
|
429
|
+
[sdk_1.EMode.NON_QV]: args.messageProcessorZkeyNonQv,
|
|
430
|
+
[sdk_1.EMode.FULL]: args.messageProcessorZkeyFull,
|
|
431
|
+
};
|
|
432
|
+
const tallyKeys = {
|
|
433
|
+
[sdk_1.EMode.QV]: args.voteTallyZkeyQv,
|
|
434
|
+
[sdk_1.EMode.NON_QV]: args.voteTallyZkeyNonQv,
|
|
435
|
+
[sdk_1.EMode.FULL]: args.voteTallyZkeyFull,
|
|
436
|
+
};
|
|
437
|
+
const { pollJoiningVerifyingKey, pollJoinedVerifyingKey, processVerifyingKey, tallyVerifyingKey } = await (0, sdk_1.extractAllVerifyingKeys)({
|
|
438
|
+
pollJoiningZkeyPath: args.pollJoiningZkey,
|
|
439
|
+
pollJoinedZkeyPath: args.pollJoinedZkey,
|
|
440
|
+
messageProcessorZkeyPath: processKeys[args.mode],
|
|
441
|
+
voteTallyZkeyPath: tallyKeys[args.mode],
|
|
424
442
|
});
|
|
425
443
|
await (0, sdk_1.setVerifyingKeys)({
|
|
426
|
-
stateTreeDepth:
|
|
427
|
-
|
|
428
|
-
voteOptionTreeDepth:
|
|
429
|
-
messageBatchSize:
|
|
430
|
-
pollStateTreeDepth:
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
mode:
|
|
444
|
+
stateTreeDepth: args.stateTreeDepth,
|
|
445
|
+
tallyProcessingStateTreeDepth: args.tallyProcessingStateTreeDepth,
|
|
446
|
+
voteOptionTreeDepth: args.voteOptionTreeDepth,
|
|
447
|
+
messageBatchSize: args.messageBatchSize,
|
|
448
|
+
pollStateTreeDepth: args.pollStateTreeDepth || args.stateTreeDepth,
|
|
449
|
+
pollJoiningVerifyingKey: pollJoiningVerifyingKey,
|
|
450
|
+
pollJoinedVerifyingKey: pollJoinedVerifyingKey,
|
|
451
|
+
processMessagesVerifyingKey: processVerifyingKey,
|
|
452
|
+
tallyVotesVerifyingKey: tallyVerifyingKey,
|
|
453
|
+
verifyingKeysRegistryAddress,
|
|
454
|
+
mode: args.mode,
|
|
437
455
|
signer,
|
|
438
456
|
});
|
|
439
457
|
}
|
|
@@ -444,9 +462,9 @@ program
|
|
|
444
462
|
program
|
|
445
463
|
.command("publish")
|
|
446
464
|
.description("publish a new message to a MACI Poll contract")
|
|
447
|
-
.requiredOption("-p, --
|
|
465
|
+
.requiredOption("-p, --public-key <publicKey>", "the MACI public key which should replace the user's public key in the state tree")
|
|
448
466
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
449
|
-
.option("-k, --
|
|
467
|
+
.option("-k, --private-key <privateKey>", "your serialized MACI private key")
|
|
450
468
|
.requiredOption("-i, --state-index <stateIndex>", "the user's state index", BigInt)
|
|
451
469
|
.requiredOption("-v, --vote-option-index <voteOptionIndex>", "the vote option index", BigInt)
|
|
452
470
|
.requiredOption("-n, --nonce <nonce>", "the message nonce", BigInt)
|
|
@@ -455,25 +473,25 @@ program
|
|
|
455
473
|
.requiredOption("-w, --new-vote-weight <newVoteWeight>", "the new vote weight", BigInt)
|
|
456
474
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
457
475
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
458
|
-
.action(async (
|
|
476
|
+
.action(async (args) => {
|
|
459
477
|
try {
|
|
460
478
|
const signer = await getSigner();
|
|
461
479
|
const network = await signer.provider?.getNetwork();
|
|
462
480
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
463
481
|
contractNames: [sdk_1.EContracts.MACI],
|
|
464
482
|
network: network?.name,
|
|
465
|
-
defaultAddresses: [
|
|
483
|
+
defaultAddresses: [args.maciAddress],
|
|
466
484
|
});
|
|
467
|
-
const privateKey =
|
|
485
|
+
const privateKey = args.privateKey || (await (0, utils_1.promptSensitiveValue)("Insert your MACI private key"));
|
|
468
486
|
await (0, sdk_1.publish)({
|
|
469
|
-
|
|
470
|
-
stateIndex:
|
|
471
|
-
voteOptionIndex:
|
|
472
|
-
nonce:
|
|
473
|
-
pollId:
|
|
474
|
-
newVoteWeight:
|
|
487
|
+
publicKey: args.publicKey,
|
|
488
|
+
stateIndex: args.stateIndex,
|
|
489
|
+
voteOptionIndex: args.voteOptionIndex,
|
|
490
|
+
nonce: args.nonce,
|
|
491
|
+
pollId: args.pollId,
|
|
492
|
+
newVoteWeight: args.newVoteWeight,
|
|
475
493
|
maciAddress,
|
|
476
|
-
salt:
|
|
494
|
+
salt: args.salt,
|
|
477
495
|
privateKey,
|
|
478
496
|
signer,
|
|
479
497
|
});
|
|
@@ -488,23 +506,23 @@ program
|
|
|
488
506
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
489
507
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
490
508
|
.requiredOption("-p, --poll-id <pollId>", "the poll id", BigInt)
|
|
491
|
-
.action(async (
|
|
509
|
+
.action(async (args) => {
|
|
492
510
|
try {
|
|
493
511
|
const signer = await getSigner();
|
|
494
512
|
const network = await signer.provider?.getNetwork();
|
|
495
513
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
496
514
|
contractNames: [sdk_1.EContracts.MACI],
|
|
497
515
|
network: network?.name,
|
|
498
|
-
defaultAddresses: [
|
|
516
|
+
defaultAddresses: [args.maciAddress],
|
|
499
517
|
});
|
|
500
518
|
const receipt = await (0, sdk_1.mergeSignups)({
|
|
501
|
-
pollId:
|
|
519
|
+
pollId: args.pollId,
|
|
502
520
|
maciAddress,
|
|
503
521
|
signer,
|
|
504
522
|
});
|
|
505
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
523
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.info)(`Transaction hash: ${receipt.hash}`) });
|
|
506
524
|
(0, sdk_1.logGreen)({
|
|
507
|
-
quiet:
|
|
525
|
+
quiet: args.quiet,
|
|
508
526
|
text: (0, sdk_1.success)(`Executed mergeSignups(); gas used: ${receipt.gasUsed.toString()}`),
|
|
509
527
|
});
|
|
510
528
|
}
|
|
@@ -518,37 +536,39 @@ program
|
|
|
518
536
|
.requiredOption("-s, --seconds <seconds>", "the number of seconds to fast-forward", parseInt)
|
|
519
537
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
520
538
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
521
|
-
.action(async (
|
|
539
|
+
.action(async (args) => {
|
|
522
540
|
try {
|
|
523
|
-
(0, utils_1.banner)(
|
|
541
|
+
(0, utils_1.banner)(args.quiet);
|
|
524
542
|
const signer = await getSigner();
|
|
525
|
-
await (0, sdk_1.timeTravel)({ seconds:
|
|
526
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
543
|
+
await (0, sdk_1.timeTravel)({ seconds: args.seconds, signer });
|
|
544
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`Fast-forwarded ${args.seconds} seconds`) });
|
|
527
545
|
}
|
|
528
546
|
catch (error) {
|
|
529
547
|
program.error(error.message, { exitCode: 1 });
|
|
530
548
|
}
|
|
531
549
|
});
|
|
532
550
|
program
|
|
533
|
-
.command("
|
|
551
|
+
.command("extractVerifyingKeyToFile")
|
|
534
552
|
.description("extract vkey to json file")
|
|
535
553
|
.requiredOption("--poll-joining-zkey <pollJoiningZkey>", "the poll joining zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
536
554
|
.requiredOption("--poll-joined-zkey <pollJoinedZkey>", "the poll joined zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
537
|
-
.requiredOption("--
|
|
538
|
-
.requiredOption("--tally-
|
|
539
|
-
.requiredOption("--
|
|
540
|
-
.requiredOption("--
|
|
555
|
+
.requiredOption("--message-processor-zkey-qv <messageProcessorZkeyPathQv>", "the message processor qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
556
|
+
.requiredOption("--vote-tally-zkey-qv <voteTallyZkeyPathQv>", "the vote tally qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
557
|
+
.requiredOption("--message-processor-zkey-non-qv <messageProcessorZkeyPathNonQv>", "the message processor non-qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
558
|
+
.requiredOption("--message-processor-zkey-full <messageProcessorZkeyPathFull>", "the message processor full zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
559
|
+
.requiredOption("--vote-tally-zkey-non-qv <voteTallyZkeyPathNonQv>", "the vote tally non-qv zkey path (see different options for zkey files to use specific circuits https://maci.pse.dev/docs/trusted-setup, https://maci.pse.dev/docs/testing/#pre-compiled-artifacts-for-testing)")
|
|
541
560
|
.requiredOption("-o, --output-file <outputFile>", "the output file path of extracted vkeys")
|
|
542
|
-
.action(async (
|
|
561
|
+
.action(async (args) => {
|
|
543
562
|
try {
|
|
544
|
-
await (0, sdk_1.
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
563
|
+
await (0, sdk_1.extractVerifyingKeyToFile)({
|
|
564
|
+
messageProcessorZkeyPathQv: args.messageProcessorZkeyQv,
|
|
565
|
+
messageProcessorZkeyPathFull: args.messageProcessorZkeyFull,
|
|
566
|
+
voteTallyZkeyPathQv: args.voteTallyZkeyQv,
|
|
567
|
+
messageProcessorZkeyPathNonQv: args.messageProcessorZkeyNonQv,
|
|
568
|
+
voteTallyZkeyPathNonQv: args.voteTallyZkeyNonQv,
|
|
569
|
+
pollJoiningZkeyPath: args.pollJoiningZkey,
|
|
570
|
+
pollJoinedZkeyPath: args.pollJoinedZkey,
|
|
571
|
+
outputFilePath: args.outputFile,
|
|
552
572
|
});
|
|
553
573
|
}
|
|
554
574
|
catch (error) {
|
|
@@ -558,28 +578,28 @@ program
|
|
|
558
578
|
program
|
|
559
579
|
.command("signup")
|
|
560
580
|
.description("Sign up to a MACI contract")
|
|
561
|
-
.requiredOption("-p, --
|
|
581
|
+
.requiredOption("-p, --public-key <publicKey>", "the MACI public key")
|
|
562
582
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
563
583
|
.option("-s, --sg-data <sgData>", "the signup gateway data")
|
|
564
584
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
565
585
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
566
|
-
.action(async (
|
|
586
|
+
.action(async (args) => {
|
|
567
587
|
try {
|
|
568
588
|
const signer = await getSigner();
|
|
569
589
|
const network = await signer.provider?.getNetwork();
|
|
570
590
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
571
591
|
contractNames: [sdk_1.EContracts.MACI],
|
|
572
592
|
network: network?.name,
|
|
573
|
-
defaultAddresses: [
|
|
593
|
+
defaultAddresses: [args.maciAddress],
|
|
574
594
|
});
|
|
575
595
|
const data = await (0, sdk_1.signup)({
|
|
576
|
-
|
|
596
|
+
maciPublicKey: args.publicKey,
|
|
577
597
|
maciAddress,
|
|
578
|
-
sgData:
|
|
598
|
+
sgData: args.sgData ?? utils_1.DEFAULT_SG_DATA,
|
|
579
599
|
signer,
|
|
580
600
|
});
|
|
581
601
|
(0, sdk_1.logGreen)({
|
|
582
|
-
quiet:
|
|
602
|
+
quiet: args.quiet,
|
|
583
603
|
text: (0, sdk_1.success)(`State index: ${data.stateIndex.toString()}\n Transaction hash: ${data.transactionHash}`),
|
|
584
604
|
});
|
|
585
605
|
}
|
|
@@ -590,28 +610,28 @@ program
|
|
|
590
610
|
program
|
|
591
611
|
.command("isRegisteredUser")
|
|
592
612
|
.description("Checks if user is registered with their public key and get their data")
|
|
593
|
-
.requiredOption("-p, --
|
|
613
|
+
.requiredOption("-p, --public-key <publicKey>", "the MACI public key")
|
|
594
614
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
595
615
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
596
|
-
.action(async (
|
|
616
|
+
.action(async (args) => {
|
|
597
617
|
try {
|
|
598
618
|
const signer = await getSigner();
|
|
599
619
|
const network = await signer.provider?.getNetwork();
|
|
600
620
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
601
621
|
contractNames: [sdk_1.EContracts.MACI],
|
|
602
622
|
network: network?.name,
|
|
603
|
-
defaultAddresses: [
|
|
623
|
+
defaultAddresses: [args.maciAddress],
|
|
604
624
|
});
|
|
605
625
|
const data = await (0, sdk_1.getSignedupUserData)({
|
|
606
|
-
|
|
626
|
+
maciPublicKey: args.publicKey,
|
|
607
627
|
maciAddress,
|
|
608
628
|
signer,
|
|
609
629
|
});
|
|
610
630
|
if (data.isRegistered) {
|
|
611
|
-
(0, sdk_1.logGreen)({ quiet:
|
|
631
|
+
(0, sdk_1.logGreen)({ quiet: args.quiet, text: (0, sdk_1.success)(`State index: ${data.stateIndex?.toString()}`) });
|
|
612
632
|
}
|
|
613
633
|
else {
|
|
614
|
-
(0, sdk_1.logRed)({ quiet:
|
|
634
|
+
(0, sdk_1.logRed)({ quiet: args.quiet, text: "User is not registered" });
|
|
615
635
|
}
|
|
616
636
|
}
|
|
617
637
|
catch (error) {
|
|
@@ -621,32 +641,32 @@ program
|
|
|
621
641
|
program
|
|
622
642
|
.command("isJoinedUser")
|
|
623
643
|
.description("Checks if user is joined to the poll with public key")
|
|
624
|
-
.requiredOption("-p, --
|
|
644
|
+
.requiredOption("-p, --public-key <publicKey>", "the MACI public key")
|
|
625
645
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
626
646
|
.requiredOption("-o, --poll-id <pollId>", "the poll id", BigInt)
|
|
627
647
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
628
648
|
.option("--start-block <startBlock>", "the block number to start looking for events from", parseInt)
|
|
629
649
|
.option("--end-block <endBlock>", "the block number to end looking for events from", parseInt)
|
|
630
650
|
.option("--blocks-per-batch <blockPerBatch>", "the number of blocks to process per batch", parseInt)
|
|
631
|
-
.action(async (
|
|
651
|
+
.action(async (args) => {
|
|
632
652
|
try {
|
|
633
653
|
const signer = await getSigner();
|
|
634
654
|
const network = await signer.provider?.getNetwork();
|
|
635
655
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
636
656
|
contractNames: [sdk_1.EContracts.MACI],
|
|
637
657
|
network: network?.name,
|
|
638
|
-
defaultAddresses: [
|
|
658
|
+
defaultAddresses: [args.maciAddress],
|
|
639
659
|
});
|
|
640
660
|
const data = await (0, sdk_1.getJoinedUserData)({
|
|
641
|
-
|
|
642
|
-
startBlock:
|
|
661
|
+
pollPublicKey: args.publicKey,
|
|
662
|
+
startBlock: args.startBlock,
|
|
643
663
|
maciAddress,
|
|
644
|
-
pollId:
|
|
664
|
+
pollId: args.pollId,
|
|
645
665
|
signer,
|
|
646
666
|
});
|
|
647
667
|
if (data.isJoined) {
|
|
648
668
|
(0, sdk_1.logGreen)({
|
|
649
|
-
quiet:
|
|
669
|
+
quiet: args.quiet,
|
|
650
670
|
text: (0, sdk_1.success)([
|
|
651
671
|
`Poll state index: ${data.pollStateIndex?.toString()}, registered: ${data.isJoined}`,
|
|
652
672
|
`Voice credits: ${data.voiceCredits?.toString()}`,
|
|
@@ -654,7 +674,7 @@ program
|
|
|
654
674
|
});
|
|
655
675
|
}
|
|
656
676
|
else {
|
|
657
|
-
(0, sdk_1.logRed)({ quiet:
|
|
677
|
+
(0, sdk_1.logRed)({ quiet: args.quiet, text: "User has not joined the poll" });
|
|
658
678
|
}
|
|
659
679
|
}
|
|
660
680
|
catch (error) {
|
|
@@ -666,29 +686,34 @@ program
|
|
|
666
686
|
.description("Get deployed poll from MACI contract")
|
|
667
687
|
.option("-p, --poll <poll>", "the poll id")
|
|
668
688
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
669
|
-
.action(async (
|
|
689
|
+
.action(async (args) => {
|
|
670
690
|
try {
|
|
671
691
|
const signer = await getSigner();
|
|
672
692
|
const network = await signer.provider?.getNetwork();
|
|
673
693
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
674
694
|
contractNames: [sdk_1.EContracts.MACI],
|
|
675
695
|
network: network?.name,
|
|
676
|
-
defaultAddresses: [
|
|
696
|
+
defaultAddresses: [args.maciAddress],
|
|
677
697
|
});
|
|
678
698
|
const details = await (0, sdk_1.getPoll)({
|
|
679
|
-
pollId:
|
|
699
|
+
pollId: args.poll,
|
|
680
700
|
maciAddress,
|
|
681
701
|
signer,
|
|
682
702
|
});
|
|
703
|
+
const modeNames = {
|
|
704
|
+
[sdk_1.EMode.QV]: "Quadratic Voting",
|
|
705
|
+
[sdk_1.EMode.NON_QV]: "Non-Quadratic Voting",
|
|
706
|
+
[sdk_1.EMode.FULL]: "Full Credits Voting",
|
|
707
|
+
};
|
|
683
708
|
(0, sdk_1.logGreen)({
|
|
684
709
|
quiet: true,
|
|
685
710
|
text: (0, sdk_1.success)([
|
|
686
711
|
`ID: ${details.id}`,
|
|
687
712
|
`Start time: ${new Date(Number(details.startDate) * 1000).toString()}`,
|
|
688
713
|
`End time: ${new Date(Number(details.endDate) * 1000).toString()}`,
|
|
689
|
-
`Number of signups ${details.
|
|
714
|
+
`Number of signups ${details.totalSignups}`,
|
|
690
715
|
`State tree merged: ${details.isMerged}`,
|
|
691
|
-
`Mode: ${details.mode
|
|
716
|
+
`Mode: ${modeNames[details.mode]}`,
|
|
692
717
|
].join("\n")),
|
|
693
718
|
});
|
|
694
719
|
}
|
|
@@ -703,15 +728,15 @@ program
|
|
|
703
728
|
.requiredOption("-w, --address <address>", "the address to fund")
|
|
704
729
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
705
730
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
706
|
-
.action(async (
|
|
731
|
+
.action(async (args) => {
|
|
707
732
|
try {
|
|
708
|
-
(0, utils_1.banner)(
|
|
733
|
+
(0, utils_1.banner)(args.quiet);
|
|
709
734
|
const signer = await getSigner();
|
|
710
|
-
const hash = await (0, sdk_1.fundWallet)({ amount:
|
|
711
|
-
(0, sdk_1.logYellow)({ quiet:
|
|
735
|
+
const hash = await (0, sdk_1.fundWallet)({ amount: args.amount, address: args.address, signer });
|
|
736
|
+
(0, sdk_1.logYellow)({ quiet: args.quiet, text: (0, sdk_1.info)(`Transaction hash: ${hash}`) });
|
|
712
737
|
(0, sdk_1.logGreen)({
|
|
713
|
-
quiet:
|
|
714
|
-
text: (0, sdk_1.success)(`Successfully funded ${
|
|
738
|
+
quiet: args.quiet,
|
|
739
|
+
text: (0, sdk_1.success)(`Successfully funded ${args.address} with ${args.amount} wei`),
|
|
715
740
|
});
|
|
716
741
|
}
|
|
717
742
|
catch (error) {
|
|
@@ -726,34 +751,34 @@ program
|
|
|
726
751
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
727
752
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
728
753
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
729
|
-
.action(async (
|
|
754
|
+
.action(async (args) => {
|
|
730
755
|
try {
|
|
731
|
-
(0, utils_1.banner)(
|
|
756
|
+
(0, utils_1.banner)(args.quiet);
|
|
732
757
|
const signer = await getSigner();
|
|
733
758
|
const network = await signer.provider?.getNetwork();
|
|
734
759
|
// read the tally file
|
|
735
|
-
const isTallyFileExists = fs_1.default.existsSync(
|
|
736
|
-
if (!
|
|
737
|
-
throw new Error(`Unable to open ${
|
|
760
|
+
const isTallyFileExists = fs_1.default.existsSync(args.tallyFile);
|
|
761
|
+
if (!args.tallyFile || !isTallyFileExists) {
|
|
762
|
+
throw new Error(`Unable to open ${args.tallyFile}`);
|
|
738
763
|
}
|
|
739
|
-
const tallyData = await (0, utils_1.readJSONFile)(
|
|
764
|
+
const tallyData = await (0, utils_1.readJSONFile)(args.tallyFile);
|
|
740
765
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
741
766
|
contractNames: [sdk_1.EContracts.MACI],
|
|
742
767
|
network: network?.name,
|
|
743
|
-
defaultAddresses: [
|
|
768
|
+
defaultAddresses: [args.maciAddress],
|
|
744
769
|
});
|
|
745
|
-
const pollParams = await (0, sdk_1.getPollParams)({ pollId:
|
|
770
|
+
const pollParams = await (0, sdk_1.getPollParams)({ pollId: args.pollId, maciContractAddress: maciAddress, signer });
|
|
746
771
|
const tallyCommitments = (0, sdk_1.generateTallyCommitments)({
|
|
747
772
|
tallyData,
|
|
748
773
|
voteOptionTreeDepth: pollParams.voteOptionTreeDepth,
|
|
749
774
|
});
|
|
750
775
|
await (0, sdk_1.verify)({
|
|
751
776
|
tallyData,
|
|
752
|
-
pollId:
|
|
777
|
+
pollId: args.pollId,
|
|
753
778
|
maciAddress,
|
|
754
779
|
signer,
|
|
755
780
|
tallyCommitments,
|
|
756
|
-
|
|
781
|
+
totalVoteOptions: pollParams.totalVoteOptions,
|
|
757
782
|
voteOptionTreeDepth: pollParams.voteOptionTreeDepth,
|
|
758
783
|
});
|
|
759
784
|
}
|
|
@@ -762,34 +787,34 @@ program
|
|
|
762
787
|
}
|
|
763
788
|
});
|
|
764
789
|
program
|
|
765
|
-
.command("
|
|
790
|
+
.command("generateProofs")
|
|
766
791
|
.description("generate the proofs for a poll")
|
|
767
|
-
.option("-k, --
|
|
792
|
+
.option("-k, --private-key <privateKey>", "your serialized MACI private key")
|
|
768
793
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
769
794
|
.requiredOption("-o, --poll-id <pollId>", "the poll id", BigInt)
|
|
770
795
|
.requiredOption("-t, --tally-file <tallyFile>", "the tally file with results, per vote option spent credits, spent voice credits total")
|
|
771
796
|
.option("-r, --rapidsnark <rapidsnark>", "the path to the rapidsnark binary")
|
|
772
|
-
.option("-g, --
|
|
773
|
-
.option("--
|
|
774
|
-
.option("--tally-
|
|
775
|
-
.option("--tally-
|
|
797
|
+
.option("-g, --message-processor-witness-generator <messageProcessorWitnessGenerator>", "the path to the process witness generation binary")
|
|
798
|
+
.option("--message-processor-witnessDat <messageProcessorWitnessDat>", "the path to the process witness dat file")
|
|
799
|
+
.option("--vote-tally-witness-generator <voteTallyWitnessGenerator>", "the path to the tally witness generation binary")
|
|
800
|
+
.option("--vote-tally-witnessDat <voteTallyWitnessDat>", "the path to the tally witness dat file")
|
|
776
801
|
.requiredOption("--poll-joining-zkey <processJoinZkey>", "the path to the poll join zkey")
|
|
777
|
-
.requiredOption("--
|
|
778
|
-
.requiredOption("--tally-zkey <
|
|
802
|
+
.requiredOption("--message-processor-zkey <messageProcessorZkey>", "the path to the process zkey")
|
|
803
|
+
.requiredOption("--vote-tally-zkey <voteTallyZkey>", "the path to the tally zkey")
|
|
779
804
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
780
805
|
.option("-p, --rpc-provider <provider>", "the rpc provider URL")
|
|
781
806
|
.requiredOption("-f, --output <outputDir>", "the output directory for proofs")
|
|
782
807
|
.option("--transaction-hash <transactionHash>", "transaction hash of MACI contract creation")
|
|
783
808
|
.option("-w, --wasm", "whether to use the wasm binaries")
|
|
784
|
-
.option("--
|
|
785
|
-
.option("--tally-wasm <
|
|
809
|
+
.option("--message-processor-wasm <messageProcessorWasm>", "the path to the process witness generation wasm binary")
|
|
810
|
+
.option("--vote-tally-wasm <voteTallyWasm>", "the path to the tally witness generation wasm binary")
|
|
786
811
|
.option("--state-file <stateFile>", "the path to the state file containing the serialized maci state")
|
|
787
812
|
.option("--start-block <startBlock>", "the block number to start looking for events from", parseInt)
|
|
788
813
|
.option("--end-block <endBlock>", "the block number to end looking for events from", parseInt)
|
|
789
814
|
.option("--blocks-per-batch <blockPerBatch>", "the number of blocks to process per batch", parseInt)
|
|
790
|
-
.option("-
|
|
815
|
+
.option("-m, --mode <mode>", "Voting mode (qv, non-qv, full)", (value) => constants_1.MODE_NAME_TO_ENUM[value], sdk_1.EMode.QV)
|
|
791
816
|
.option("-b, --ipfs-message-backup-files <ipfsMessageBackupFiles>", "Backup files for ipfs messages (name format: ipfsHash1.json, ipfsHash2.json, ..., ipfsHashN.json)", (value) => value?.split(/\s*,\s*/))
|
|
792
|
-
.action(async ({ quiet, maciAddress, pollId, ipfsMessageBackupFiles, stateFile, startBlock, endBlock, blocksPerBatch,
|
|
817
|
+
.action(async ({ quiet, maciAddress, pollId, ipfsMessageBackupFiles, stateFile, startBlock, endBlock, blocksPerBatch, privateKey, transactionHash, output, tallyFile, voteTallyZkey, voteTallyWitnessGenerator, voteTallyWasm, messageProcessorZkey, messageProcessorWitnessGenerator, messageProcessorWasm, mode, voteTallyWitnessDat, messageProcessorWitnessDat, wasm, rapidsnark, }) => {
|
|
793
818
|
try {
|
|
794
819
|
(0, utils_1.banner)(quiet);
|
|
795
820
|
const signer = await getSigner();
|
|
@@ -799,7 +824,7 @@ program
|
|
|
799
824
|
network: network?.name,
|
|
800
825
|
defaultAddresses: [maciAddress],
|
|
801
826
|
});
|
|
802
|
-
const coordinatorPrivateKey =
|
|
827
|
+
const coordinatorPrivateKey = privateKey || (await (0, utils_1.promptSensitiveValue)("Insert your MACI private key"));
|
|
803
828
|
await (0, sdk_1.generateProofs)({
|
|
804
829
|
maciAddress: maciContractAddress,
|
|
805
830
|
coordinatorPrivateKey,
|
|
@@ -813,15 +838,15 @@ program
|
|
|
813
838
|
signer,
|
|
814
839
|
outputDir: output,
|
|
815
840
|
tallyFile,
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
841
|
+
voteTallyZkey,
|
|
842
|
+
voteTallyWitnessGenerator,
|
|
843
|
+
voteTallyWasm,
|
|
844
|
+
messageProcessorZkey,
|
|
845
|
+
messageProcessorWitnessGenerator,
|
|
846
|
+
messageProcessorWasm,
|
|
847
|
+
mode,
|
|
848
|
+
voteTallyWitnessDatFile: voteTallyWitnessDat,
|
|
849
|
+
messageProcessorWitnessDatFile: messageProcessorWitnessDat,
|
|
825
850
|
useWasm: wasm,
|
|
826
851
|
rapidsnark,
|
|
827
852
|
});
|
|
@@ -831,12 +856,12 @@ program
|
|
|
831
856
|
}
|
|
832
857
|
});
|
|
833
858
|
program
|
|
834
|
-
.command("
|
|
859
|
+
.command("generateLocalState")
|
|
835
860
|
.description("generate a local MACI state from the smart contracts events")
|
|
836
861
|
.requiredOption("-o, --output <outputPath>", "the path where to write the state")
|
|
837
862
|
.requiredOption("-p, --poll-id <pollId>", "the id of the poll", BigInt)
|
|
838
863
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
839
|
-
.option("-k, --
|
|
864
|
+
.option("-k, --private-key <privateKey>", "your serialized MACI private key")
|
|
840
865
|
.option("--start-block <startBlock>", "the start block number", parseInt)
|
|
841
866
|
.option("--end-block <endBlock>", "the end block number", parseInt)
|
|
842
867
|
.option("--blocks-per-batch <blockPerBatch>", "the blocks per batch", parseInt)
|
|
@@ -846,30 +871,30 @@ program
|
|
|
846
871
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
847
872
|
.option("-b, --ipfs-message-backup-files <ipfsMessageBackupFiles>", "Backup files for ipfs messages (name format: ipfsHash1.json, ipfsHash2.json, ..., ipfsHashN.json)", (value) => value?.split(/\s*,\s*/))
|
|
848
873
|
.option("-l, --logs-output <logsOutputPath>", "the path where to save the logs for debugging and auditing purposes")
|
|
849
|
-
.action(async (
|
|
874
|
+
.action(async (args) => {
|
|
850
875
|
try {
|
|
851
876
|
const signer = await getSigner();
|
|
852
877
|
const network = await signer.provider?.getNetwork();
|
|
853
878
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
854
879
|
contractNames: [sdk_1.EContracts.MACI],
|
|
855
880
|
network: network?.name,
|
|
856
|
-
defaultAddresses: [
|
|
881
|
+
defaultAddresses: [args.maciAddress],
|
|
857
882
|
});
|
|
858
|
-
const coordinatorPrivateKey =
|
|
883
|
+
const coordinatorPrivateKey = args.privateKey || (await (0, utils_1.promptSensitiveValue)("Insert your MACI private key"));
|
|
859
884
|
await (0, sdk_1.generateMaciState)({
|
|
860
|
-
outputPath:
|
|
861
|
-
pollId:
|
|
885
|
+
outputPath: args.output.toString(),
|
|
886
|
+
pollId: args.pollId,
|
|
862
887
|
maciAddress,
|
|
863
888
|
coordinatorPrivateKey,
|
|
864
|
-
provider:
|
|
865
|
-
endBlock:
|
|
866
|
-
startBlock:
|
|
867
|
-
blockPerBatch:
|
|
868
|
-
transactionHash:
|
|
869
|
-
ipfsMessageBackupFiles:
|
|
870
|
-
sleep:
|
|
889
|
+
provider: args.rpcProvider,
|
|
890
|
+
endBlock: args.endBlock,
|
|
891
|
+
startBlock: args.startBlock,
|
|
892
|
+
blockPerBatch: args.blocksPerBatch,
|
|
893
|
+
transactionHash: args.transactionHash,
|
|
894
|
+
ipfsMessageBackupFiles: args.ipfsMessageBackupFiles,
|
|
895
|
+
sleep: args.sleep,
|
|
871
896
|
signer,
|
|
872
|
-
logsOutputPath:
|
|
897
|
+
logsOutputPath: args.logsOutput,
|
|
873
898
|
});
|
|
874
899
|
}
|
|
875
900
|
catch (error) {
|
|
@@ -884,20 +909,20 @@ program
|
|
|
884
909
|
.option("-q, --quiet <quiet>", "whether to print values to the console", (value) => value === "true", false)
|
|
885
910
|
.option("-r, --rpc-provider <provider>", "the rpc provider URL")
|
|
886
911
|
.option("-x, --maci-address <maciAddress>", "the MACI contract address")
|
|
887
|
-
.requiredOption("-f, --proof-dir <proofDir>", "the proof output directory from the
|
|
888
|
-
.action(async (
|
|
912
|
+
.requiredOption("-f, --proof-dir <proofDir>", "the proof output directory from the generateProofs subcommand")
|
|
913
|
+
.action(async (args) => {
|
|
889
914
|
try {
|
|
890
915
|
const signer = await getSigner();
|
|
891
916
|
const network = await signer.provider?.getNetwork();
|
|
892
917
|
const [maciAddress] = (0, utils_1.readContractAddresses)({
|
|
893
918
|
contractNames: [sdk_1.EContracts.MACI],
|
|
894
919
|
network: network?.name,
|
|
895
|
-
defaultAddresses: [
|
|
920
|
+
defaultAddresses: [args.maciAddress],
|
|
896
921
|
});
|
|
897
922
|
await (0, sdk_1.proveOnChain)({
|
|
898
|
-
pollId:
|
|
899
|
-
tallyFile:
|
|
900
|
-
proofDir:
|
|
923
|
+
pollId: args.pollId,
|
|
924
|
+
tallyFile: args.tallyFile,
|
|
925
|
+
proofDir: args.proofDir,
|
|
901
926
|
maciAddress,
|
|
902
927
|
signer,
|
|
903
928
|
});
|