@maci-protocol/core 0.0.0-ci.4c6d4e8 → 0.0.0-ci.4d0e3a3
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/CHANGELOG.md +414 -0
- package/LICENSE +1 -2
- package/README.md +3 -3
- package/build/ts/MaciState.d.ts +10 -8
- package/build/ts/MaciState.d.ts.map +1 -1
- package/build/ts/MaciState.js +21 -20
- package/build/ts/MaciState.js.map +1 -1
- package/build/ts/Poll.d.ts +54 -42
- package/build/ts/Poll.d.ts.map +1 -1
- package/build/ts/Poll.js +316 -318
- package/build/ts/Poll.js.map +1 -1
- package/build/ts/index.d.ts +3 -2
- package/build/ts/index.d.ts.map +1 -1
- package/build/ts/index.js +11 -9
- package/build/ts/index.js.map +1 -1
- package/build/ts/utils/constants.d.ts +8 -0
- package/build/ts/utils/constants.d.ts.map +1 -1
- package/build/ts/utils/constants.js +10 -1
- package/build/ts/utils/constants.js.map +1 -1
- package/build/ts/utils/errors.d.ts +2 -1
- package/build/ts/utils/errors.d.ts.map +1 -1
- package/build/ts/utils/errors.js +1 -0
- package/build/ts/utils/errors.js.map +1 -1
- package/build/ts/utils/types.d.ts +65 -37
- package/build/ts/utils/types.d.ts.map +1 -1
- package/build/ts/utils/utils.d.ts +16 -16
- package/build/ts/utils/utils.d.ts.map +1 -1
- package/build/ts/utils/utils.js +21 -21
- package/build/ts/utils/utils.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -8
package/build/ts/Poll.d.ts
CHANGED
|
@@ -1,48 +1,53 @@
|
|
|
1
1
|
import { IncrementalQuinTree } from "@maci-protocol/crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { VoteCommand, Keypair, Ballot, PublicKey, Message, StateLeaf, VoteCounts } from "@maci-protocol/domainobjs";
|
|
3
3
|
import { LeanIMT } from "@zk-kit/lean-imt";
|
|
4
|
-
import type { TreeDepths, BatchSizes, IPoll, IJsonPoll, IProcessMessagesOutput, ITallyCircuitInputs, IProcessMessagesCircuitInputs, IPollJoiningCircuitInputs, IJoiningCircuitArgs } from "./index";
|
|
5
4
|
import type { MaciState } from "./MaciState";
|
|
6
|
-
import type { IJoinedCircuitArgs, IPollJoinedCircuitInputs } from "./utils/types";
|
|
5
|
+
import type { ITreeDepths, IBatchSizes, IPoll, IJsonPoll, IProcessMessagesOutput, IVoteTallyCircuitInputs, IProcessMessagesCircuitInputs, IPollJoiningCircuitInputs, IJoiningCircuitArgs, IGetVoiceCreditsLeft, IJoinedCircuitArgs, IPollJoinedCircuitInputs } from "./utils/types";
|
|
6
|
+
import { EMode } from "./utils/constants";
|
|
7
7
|
/**
|
|
8
8
|
* A representation of the Poll contract.
|
|
9
9
|
*/
|
|
10
10
|
export declare class Poll implements IPoll {
|
|
11
11
|
coordinatorKeypair: Keypair;
|
|
12
|
-
treeDepths:
|
|
13
|
-
batchSizes:
|
|
12
|
+
treeDepths: ITreeDepths;
|
|
13
|
+
batchSizes: IBatchSizes;
|
|
14
14
|
voteOptions: bigint;
|
|
15
15
|
maxVoteOptions: number;
|
|
16
16
|
actualStateTreeDepth: number;
|
|
17
17
|
pollEndTimestamp: bigint;
|
|
18
18
|
ballots: Ballot[];
|
|
19
19
|
ballotTree?: IncrementalQuinTree;
|
|
20
|
+
voteCounts: VoteCounts[];
|
|
21
|
+
voteCountsTree?: IncrementalQuinTree;
|
|
20
22
|
messages: Message[];
|
|
21
|
-
commands:
|
|
22
|
-
|
|
23
|
+
commands: VoteCommand[];
|
|
24
|
+
encryptionPublicKeys: PublicKey[];
|
|
23
25
|
stateCopied: boolean;
|
|
24
|
-
|
|
26
|
+
publicKeys: PublicKey[];
|
|
25
27
|
stateTree?: LeanIMT;
|
|
26
|
-
|
|
28
|
+
totalBatchesProcessed: number;
|
|
27
29
|
currentMessageBatchIndex: number;
|
|
28
30
|
maciStateRef: MaciState;
|
|
29
31
|
pollId: bigint;
|
|
30
32
|
sbSalts: Record<number | string, bigint>;
|
|
31
33
|
resultRootSalts: Record<number | string, bigint>;
|
|
32
|
-
|
|
34
|
+
perVoteOptionSpentVoiceCreditsRootSalts: Record<number | string, bigint>;
|
|
33
35
|
spentVoiceCreditSubtotalSalts: Record<number | string, bigint>;
|
|
34
36
|
tallyResult: bigint[];
|
|
35
|
-
|
|
37
|
+
perVoteOptionSpentVoiceCredits: bigint[];
|
|
36
38
|
numBatchesTallied: number;
|
|
37
39
|
totalSpentVoiceCredits: bigint;
|
|
38
40
|
emptyBallot: Ballot;
|
|
39
|
-
emptyBallotHash
|
|
41
|
+
emptyBallotHash: bigint;
|
|
42
|
+
emptyVoteCounts: VoteCounts;
|
|
43
|
+
emptyVoteCountsHash: bigint;
|
|
40
44
|
chainHash: bigint;
|
|
41
45
|
batchHashes: bigint[];
|
|
42
46
|
pollStateLeaves: StateLeaf[];
|
|
43
47
|
pollStateTree?: IncrementalQuinTree;
|
|
44
48
|
pollNullifiers: Map<bigint, boolean>;
|
|
45
|
-
private
|
|
49
|
+
private mode;
|
|
50
|
+
private totalSignups;
|
|
46
51
|
/**
|
|
47
52
|
* Constructs a new Poll object.
|
|
48
53
|
* @param pollEndTimestamp - The Unix timestamp at which the poll ends.
|
|
@@ -52,7 +57,7 @@ export declare class Poll implements IPoll {
|
|
|
52
57
|
* @param maciStateRef - The reference to the MACI state.
|
|
53
58
|
* @param pollId - The poll id
|
|
54
59
|
*/
|
|
55
|
-
constructor(pollEndTimestamp: bigint, coordinatorKeypair: Keypair, treeDepths:
|
|
60
|
+
constructor(pollEndTimestamp: bigint, coordinatorKeypair: Keypair, treeDepths: ITreeDepths, batchSizes: IBatchSizes, maciStateRef: MaciState, voteOptions: bigint, mode: EMode);
|
|
56
61
|
/**
|
|
57
62
|
* Check if user has already joined the poll by checking if the nullifier is registered
|
|
58
63
|
*/
|
|
@@ -60,37 +65,44 @@ export declare class Poll implements IPoll {
|
|
|
60
65
|
/**
|
|
61
66
|
* Join the anonymous user to the Poll (to the tree)
|
|
62
67
|
* @param nullifier - Hashed private key used as nullifier
|
|
63
|
-
* @param
|
|
68
|
+
* @param publicKey - The poll public key.
|
|
64
69
|
* @param newVoiceCreditBalance - New voice credit balance of the user.
|
|
65
70
|
* @returns The index of added state leaf
|
|
66
71
|
*/
|
|
67
|
-
joinPoll: (nullifier: bigint,
|
|
72
|
+
joinPoll: (nullifier: bigint, publicKey: PublicKey, newVoiceCreditBalance: bigint) => number;
|
|
68
73
|
/**
|
|
69
74
|
* Update a Poll with data from MaciState.
|
|
70
75
|
* This is the step where we copy the state from the MaciState instance,
|
|
71
76
|
* and set the number of signups we have so far.
|
|
72
|
-
* @note It should be called to generate the state for poll joining with
|
|
73
|
-
* the number of signups in the MaciState. For message processing, you should set
|
|
77
|
+
* @note It should be called to generate the state for poll joining with totalSignups set as
|
|
78
|
+
* the number of signups in the MaciState. For message processing, you should set totalSignups as
|
|
74
79
|
* the number of users who joined the poll.
|
|
75
80
|
*/
|
|
76
|
-
updatePoll: (
|
|
81
|
+
updatePoll: (totalSignups: bigint) => void;
|
|
77
82
|
/**
|
|
78
83
|
* Process one message.
|
|
79
84
|
* @param message - The message to process.
|
|
80
|
-
* @param
|
|
85
|
+
* @param encryptionPublicKey - The public key associated with the encryption private key.
|
|
81
86
|
* @returns A number of variables which will be used in the zk-SNARK circuit.
|
|
82
87
|
*/
|
|
83
|
-
processMessage: (message: Message,
|
|
88
|
+
processMessage: (message: Message, encryptionPublicKey: PublicKey) => IProcessMessagesOutput;
|
|
89
|
+
/**
|
|
90
|
+
* Get voice credits left for the voting command.
|
|
91
|
+
*
|
|
92
|
+
* @param args - arguments for getting voice credits
|
|
93
|
+
* @returns voice credits left
|
|
94
|
+
*/
|
|
95
|
+
getVoiceCreditsLeft({ stateLeaf, originalVoteWeight, newVoteWeight, mode }: IGetVoiceCreditsLeft): bigint;
|
|
84
96
|
/**
|
|
85
97
|
* Inserts a Message and the corresponding public key used to generate the
|
|
86
98
|
* ECDH shared key which was used to encrypt said message.
|
|
87
99
|
* @param message - The message to insert
|
|
88
|
-
* @param
|
|
100
|
+
* @param encryptionPublicKey - The public key used to encrypt the message
|
|
89
101
|
*/
|
|
90
|
-
publishMessage: (message: Message,
|
|
102
|
+
publishMessage: (message: Message, encryptionPublicKey: PublicKey) => void;
|
|
91
103
|
/**
|
|
92
104
|
* Updates message chain hash
|
|
93
|
-
* @param messageHash hash of message with
|
|
105
|
+
* @param messageHash hash of message with encryptionPublicKey
|
|
94
106
|
*/
|
|
95
107
|
updateChainHash: (messageHash: bigint) => void;
|
|
96
108
|
/**
|
|
@@ -98,13 +110,13 @@ export declare class Poll implements IPoll {
|
|
|
98
110
|
* @param args Poll joining circuit inputs
|
|
99
111
|
* @returns stringified circuit inputs
|
|
100
112
|
*/
|
|
101
|
-
joiningCircuitInputs: ({
|
|
113
|
+
joiningCircuitInputs: ({ maciPrivateKey, stateLeafIndex, pollPublicKey, }: IJoiningCircuitArgs) => IPollJoiningCircuitInputs;
|
|
102
114
|
/**
|
|
103
115
|
* Create circuit input for pollJoined
|
|
104
116
|
* @param args Poll joined circuit inputs
|
|
105
117
|
* @returns stringified circuit inputs
|
|
106
118
|
*/
|
|
107
|
-
joinedCircuitInputs: ({
|
|
119
|
+
joinedCircuitInputs: ({ maciPrivateKey, stateLeafIndex, voiceCreditsBalance, }: IJoinedCircuitArgs) => IPollJoinedCircuitInputs;
|
|
108
120
|
/**
|
|
109
121
|
* Pad last unclosed batch
|
|
110
122
|
*/
|
|
@@ -129,13 +141,13 @@ export declare class Poll implements IPoll {
|
|
|
129
141
|
* @param quiet - Whether to log errors or not
|
|
130
142
|
* @returns stringified circuit inputs
|
|
131
143
|
*/
|
|
132
|
-
processMessages: (pollId: bigint,
|
|
144
|
+
processMessages: (pollId: bigint, quiet?: boolean) => IProcessMessagesCircuitInputs;
|
|
133
145
|
/**
|
|
134
146
|
* Generates partial circuit inputs for processing a batch of messages
|
|
135
147
|
* @param index - The index of the partial batch.
|
|
136
148
|
* @returns stringified partial circuit inputs
|
|
137
149
|
*/
|
|
138
|
-
private
|
|
150
|
+
private generateProcessMessagesCircuitInputsPartial;
|
|
139
151
|
/**
|
|
140
152
|
* Process all messages. This function does not update the ballots or state
|
|
141
153
|
* leaves; rather, it copies and then updates them. This makes it possible
|
|
@@ -153,30 +165,30 @@ export declare class Poll implements IPoll {
|
|
|
153
165
|
hasUntalliedBallots: () => boolean;
|
|
154
166
|
/**
|
|
155
167
|
* This method tallies a ballots and updates the tally results.
|
|
156
|
-
*
|
|
168
|
+
*
|
|
169
|
+
* @returns the circuit inputs for the VoteTally circuit.
|
|
157
170
|
*/
|
|
158
|
-
tallyVotes: () =>
|
|
159
|
-
tallyVotesNonQv: () => ITallyCircuitInputs;
|
|
171
|
+
tallyVotes: () => IVoteTallyCircuitInputs;
|
|
160
172
|
/**
|
|
161
173
|
* This method generates a commitment to the total spent voice credits.
|
|
162
174
|
*
|
|
163
175
|
* This is the hash of the total spent voice credits and a salt, computed as Poseidon([totalCredits, _salt]).
|
|
164
176
|
* @param salt - The salt used in the hash function.
|
|
165
|
-
* @param
|
|
166
|
-
* @param
|
|
177
|
+
* @param ballotsToCount - The number of ballots to count for the calculation.
|
|
178
|
+
* @param mode - Voting mode, default is QV.
|
|
167
179
|
* @returns Returns the hash of the total spent voice credits and a salt, computed as Poseidon([totalCredits, _salt]).
|
|
168
180
|
*/
|
|
169
|
-
private
|
|
181
|
+
private generateSpentVoiceCreditSubtotalCommitment;
|
|
170
182
|
/**
|
|
171
183
|
* This method generates a commitment to the spent voice credits per vote option.
|
|
172
184
|
*
|
|
173
185
|
* This is the hash of the Merkle root of the spent voice credits per vote option and a salt, computed as Poseidon([root, _salt]).
|
|
174
186
|
* @param salt - The salt used in the hash function.
|
|
175
|
-
* @param
|
|
176
|
-
* @param
|
|
187
|
+
* @param ballotsToCount - The number of ballots to count for the calculation.
|
|
188
|
+
* @param mode - Voting mode, default is QV.
|
|
177
189
|
* @returns Returns the hash of the Merkle root of the spent voice credits per vote option and a salt, computed as Poseidon([root, _salt]).
|
|
178
190
|
*/
|
|
179
|
-
private
|
|
191
|
+
private generatePerVoteOptionSpentVoiceCreditsCommitment;
|
|
180
192
|
/**
|
|
181
193
|
* Create a deep copy of the Poll object.
|
|
182
194
|
* @returns A new instance of the Poll object with the same properties.
|
|
@@ -184,10 +196,10 @@ export declare class Poll implements IPoll {
|
|
|
184
196
|
copy: () => Poll;
|
|
185
197
|
/**
|
|
186
198
|
* Check if the Poll object is equal to another Poll object.
|
|
187
|
-
* @param
|
|
199
|
+
* @param poll - The Poll object to compare.
|
|
188
200
|
* @returns True if the two Poll objects are equal, false otherwise.
|
|
189
201
|
*/
|
|
190
|
-
equals: (
|
|
202
|
+
equals: (poll: Poll) => boolean;
|
|
191
203
|
/**
|
|
192
204
|
* Serialize the Poll object to a JSON object
|
|
193
205
|
* @returns a JSON object
|
|
@@ -207,13 +219,13 @@ export declare class Poll implements IPoll {
|
|
|
207
219
|
setCoordinatorKeypair: (serializedPrivateKey: string) => void;
|
|
208
220
|
/**
|
|
209
221
|
* Set the number of signups to match the ones from the contract
|
|
210
|
-
* @param
|
|
222
|
+
* @param totalSignups - the number of signups
|
|
211
223
|
*/
|
|
212
|
-
|
|
224
|
+
setTotalSignups: (totalSignups: bigint) => void;
|
|
213
225
|
/**
|
|
214
226
|
* Get the number of signups
|
|
215
227
|
* @returns The number of signups
|
|
216
228
|
*/
|
|
217
|
-
|
|
229
|
+
getTotalSignups: () => bigint;
|
|
218
230
|
}
|
|
219
231
|
//# sourceMappingURL=Poll.d.ts.map
|
package/build/ts/Poll.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Poll.d.ts","sourceRoot":"","sources":["../../ts/Poll.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAYpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"Poll.d.ts","sourceRoot":"","sources":["../../ts/Poll.ts"],"names":[],"mappings":"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"}
|