Skip to content

Commit a75a3d8

Browse files
committed
fix(contracts): fix zappify bugs for fully public contracts
1 parent 3525355 commit a75a3d8

File tree

3 files changed

+80
-82
lines changed

3 files changed

+80
-82
lines changed

src/boilerplate/contract/solidity/nodes/ContractBoilerplateGenerator.ts

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -115,67 +115,67 @@ class ContractBoilerplateGenerator {
115115
let params : any[];
116116
let functionName: string;
117117

118-
for ([functionName, parameterList] of Object.entries(circuitParams)) {
119-
for ([paramtype, params] of Object.entries(parameterList)){
120-
const returnpara = {};
121-
if(paramtype === 'returnParameters'){
122-
returnpara[ paramtype ] = params;
123-
delete parameterList[ paramtype ];
124-
}
125-
const newList: string[] = [];
126-
127-
params?.forEach(circuitParamNode => {
128-
switch (circuitParamNode.bpType) {
129-
case 'nullification':
130-
if (circuitParamNode.isNullified) {
131-
newList.push('nullifier');
132-
} else {
133-
// we use a nullification node for accessed, not nullified, states
134-
newList.push('checkNullifier')
135-
}
136-
break;
137-
case 'newCommitment':
138-
newList.push(circuitParamNode.bpType);
139-
break;
140-
case 'oldCommitmentExistence':
141-
if (!newList.includes(circuitParamNode.bpType)) newList.push(circuitParamNode.bpType);
142-
break;
143-
case 'encryption':
144-
145-
returnpara['encryptionParameters'] ??= [];
146-
returnpara['encryptionParameters'].push(circuitParamNode.bpType);
147-
break;
148-
case undefined: {
149-
if (
150-
circuitParamNode.nodeType === 'VariableDeclaration' &&
151-
!circuitParamNode.isPrivate &&
152-
!newList.some(str => str === circuitParamNode.name)
153-
){
154-
if (circuitParamNode.typeName?.members) {
155-
newList.push(...circuitParamNode.typeName.members.map(m => `${circuitParamNode.name}.${m.name}`));
118+
if (circuitParams) {
119+
for ([functionName, parameterList] of Object.entries(circuitParams)) {
120+
for ([paramtype, params] of Object.entries(parameterList)) {
121+
const returnpara = {};
122+
if (paramtype === 'returnParameters') {
123+
returnpara[paramtype] = params;
124+
delete parameterList[paramtype];
125+
}
126+
const newList: string[] = [];
127+
params?.forEach(circuitParamNode => {
128+
switch (circuitParamNode.bpType) {
129+
case 'nullification':
130+
if (circuitParamNode.isNullified) {
131+
newList.push('nullifier');
132+
} else {
133+
// we use a nullification node for accessed, not nullified, states
134+
newList.push('checkNullifier')
135+
}
136+
break;
137+
case 'newCommitment':
138+
newList.push(circuitParamNode.bpType);
139+
break;
140+
case 'oldCommitmentExistence':
141+
if (!newList.includes(circuitParamNode.bpType)) newList.push(circuitParamNode.bpType);
156142
break;
157-
} else if (circuitParamNode.typeName?.name.includes(`[`)) {
158-
// TODO arrays of structs/structs of arrays/more robust soln
159-
const arrayLen = circuitParamNode.typeName?.name.match(/(?<=\[)(\d+)(?=\])/);
160-
for (let index = 0; index < +arrayLen[0]; index++) {
161-
newList.push(`${circuitParamNode.name}[${index}]`);
143+
case 'encryption':
144+
returnpara['encryptionParameters'] ??= [];
145+
returnpara['encryptionParameters'].push(circuitParamNode.bpType);
146+
break;
147+
case undefined:
148+
{
149+
if (
150+
circuitParamNode.nodeType === 'VariableDeclaration' &&
151+
!circuitParamNode.isPrivate &&
152+
!newList.some(str => str === circuitParamNode.name)
153+
){
154+
if (circuitParamNode.typeName?.members) {
155+
newList.push(...circuitParamNode.typeName.members.map(m => `${circuitParamNode.name}.${m.name}`));
156+
break;
157+
} else if (circuitParamNode.typeName?.name.includes(`[`)) {
158+
// TODO arrays of structs/structs of arrays/more robust soln
159+
const arrayLen = circuitParamNode.typeName?.name.match(/(?<=\[)(\d+)(?=\])/);
160+
for (let index = 0; index < +arrayLen[0]; index++) {
161+
newList.push(`${circuitParamNode.name}[${index}]`);
162+
}
163+
break;
164+
} else newList.push(circuitParamNode.name);
162165
}
166+
}
167+
break;
168+
169+
default:
163170
break;
164-
} else newList.push(circuitParamNode.name);
165171
}
166-
}
167-
break;
168-
169-
default:
170-
break;
172+
});
173+
parameterList[ paramtype ] = newList;
174+
parameterList = {...parameterList, ...returnpara};
171175
}
172-
});
173-
parameterList[ paramtype ] = newList;
174-
parameterList = {...parameterList, ...returnpara};
176+
circuitParams[ functionName ] = parameterList;
177+
}
175178
}
176-
circuitParams[ functionName ] = parameterList;
177-
178-
}
179179
const constructorContainsSecret = Object.values(this.scope.bindings).some((binding: any) => binding.node.kind === 'constructor');
180180
return { nullifiersRequired, oldCommitmentAccessRequired, newCommitmentsRequired, containsAccessedOnlyState, encryptionRequired, constructorContainsSecret, circuitParams, isjoinSplitCommitmentsFunction};
181181
},

src/boilerplate/contract/solidity/raw/ContractBoilerplateGenerator.ts

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -226,34 +226,31 @@ class ContractBoilerplateGenerator {
226226
];
227227
const verifyInputs: string[] = [];
228228
const joinSplitCommitmentsInputs: string[] = [];
229-
for (let [name, _params] of Object.entries(circuitParams)) {
230-
if (_params)
231-
for (let [type, _inputs] of Object.entries(_params)) {
232-
const counter = {
233-
customInputs: 0,
234-
newNullifiers: 0,
235-
checkNullifiers: 0,
236-
newCommitments: 0,
237-
encryption: 0,
238-
};
239-
_inputs?.map(i => verifyInputsMap(type, i, counter));
240-
241-
242-
243-
}
244-
245-
if(_params && !(Object.keys(_params).includes('returnParameters')) &&!(Object.keys(_params).includes('encryptionParameters'))) verifyInput.push(`
246-
inputs[k++] = 1;`)
247-
248-
verifyInputs.push(`
249-
if (functionId == uint(FunctionNames.${name})) {
250-
uint k = 0;
251-
${verifyInput.join('')}
252-
253-
}`)
254-
verifyInput =[];
229+
if (circuitParams) {
230+
for (let [name, _params] of Object.entries(circuitParams)) {
231+
if (_params)
232+
for (let [type, _inputs] of Object.entries(_params)) {
233+
const counter = {
234+
customInputs: 0,
235+
newNullifiers: 0,
236+
checkNullifiers: 0,
237+
newCommitments: 0,
238+
encryption: 0,
239+
};
240+
_inputs?.map(i => verifyInputsMap(type, i, counter));
241+
}
242+
if(_params && !(Object.keys(_params).includes('returnParameters')) &&!(Object.keys(_params).includes('encryptionParameters'))) verifyInput.push(`
243+
inputs[k++] = 1;`)
244+
245+
verifyInputs.push(`
246+
if (functionId == uint(FunctionNames.${name})) {
247+
uint k = 0;
248+
${verifyInput.join('')}
249+
250+
}`)
251+
verifyInput =[];
252+
}
255253
}
256-
257254
const verification: string[] = [
258255
`
259256
bool result = verifier.verify(proof, inputs, vks[functionId]);`,

src/transformers/visitors/toContractVisitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ export default {
170170
let returnParameterList: any = {};
171171
let returnfunctionName: string;
172172
if (
173+
state.circuitParams &&
173174
Object.entries(state.circuitParams) &&
174175
Object.entries(state.circuitParams).length !== 0
175176
) {

0 commit comments

Comments
 (0)