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