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