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