@@ -34,7 +34,7 @@ func (g *generator) generate() string {
3434 b .WriteString (" uint256[2] calldata _pA,\n " )
3535 b .WriteString (" uint256[2][2] calldata _pB,\n " )
3636 b .WriteString (" uint256[2] calldata _pC,\n " )
37- b .WriteString (" uint256[4 ] calldata _pubSignals\n " )
37+ b .WriteString (" uint256[5 ] calldata _pubSignals\n " )
3838 b .WriteString (" ) external view returns (bool);\n " )
3939 b .WriteString ("}\n \n " )
4040 }
@@ -135,9 +135,10 @@ func (g *generator) generateConstructor() string {
135135 b .WriteString (" // ============ Constructor ============\n \n " )
136136
137137 if g .isVoteSchema () {
138- b .WriteString (" constructor(uint256 _voterRegistryRoot, address _verifier) {\n " )
138+ b .WriteString (" constructor(uint256 _voterRegistryRoot, uint256 _maxChoices, address _verifier) {\n " )
139139 b .WriteString (" contractOwner = msg.sender;\n " )
140140 b .WriteString (" voterRegistryRoot = _voterRegistryRoot;\n " )
141+ b .WriteString (" maxChoices = _maxChoices;\n " )
141142 b .WriteString (" verifier = IVerifier(_verifier);\n " )
142143 b .WriteString (" emit OwnershipTransferred(address(0), msg.sender);\n " )
143144 b .WriteString (" }\n \n " )
@@ -177,12 +178,13 @@ func (g *generator) generateVoteCastFunction() string {
177178 b .WriteString (" require(pollConfig == 1, \" poll not active\" );\n " )
178179 b .WriteString (" require(!nullifiers[_nullifier], \" already voted\" );\n " )
179180 b .WriteString ("\n " )
180- b .WriteString (" // Verify ZK proof: public inputs are [pollId, voterRegistryRoot, nullifier, voteCommitment]\n " )
181- b .WriteString (" uint256[4 ] memory pubSignals;\n " )
181+ b .WriteString (" // Verify ZK proof: public inputs are [pollId, voterRegistryRoot, nullifier, voteCommitment, maxChoices ]\n " )
182+ b .WriteString (" uint256[5 ] memory pubSignals;\n " )
182183 b .WriteString (" pubSignals[0] = _pollId;\n " )
183184 b .WriteString (" pubSignals[1] = voterRegistryRoot;\n " )
184185 b .WriteString (" pubSignals[2] = _nullifier;\n " )
185186 b .WriteString (" pubSignals[3] = _voteCommitment;\n " )
187+ b .WriteString (" pubSignals[4] = maxChoices;\n " )
186188 b .WriteString (" require(\n " )
187189 b .WriteString (" verifier.verifyProof(_pA, _pB, _pC, pubSignals),\n " )
188190 b .WriteString (" \" invalid ZK proof\" \n " )
@@ -284,6 +286,7 @@ func (g *generator) generateStateVariables() string {
284286 if g .isVoteSchema () {
285287 b .WriteString ("\n // ZK Voter Registry and Verifier\n " )
286288 b .WriteString (" uint256 public voterRegistryRoot;\n " )
289+ b .WriteString (" uint256 public maxChoices;\n " )
287290 b .WriteString (" IVerifier public verifier;\n " )
288291 b .WriteString (" mapping(uint256 => uint256) public voteCommitments; // nullifier => blinded vote commitment\n " )
289292 }
@@ -337,6 +340,12 @@ func (g *generator) generateEvents() string {
337340 b .WriteString (" // ============ Events ============\n \n " )
338341
339342 for _ , action := range g .schema .Actions {
343+ // Vote-specific: castVote event matches the hand-written function emit
344+ if g .isVoteSchema () && action .ID == "castVote" {
345+ b .WriteString (" event CastVote(uint256 epoch, uint256 seq, uint256 indexed nullifier, uint256 voteCommitment);\n " )
346+ continue
347+ }
348+
340349 params := g .inferEventParams (action )
341350 // Add epoch and seq to all events for debugging
342351 if params != "" {
0 commit comments