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