diff --git a/src/transformers/visitors/toCircuitVisitor.ts b/src/transformers/visitors/toCircuitVisitor.ts index c9de89c9..deac87b4 100644 --- a/src/transformers/visitors/toCircuitVisitor.ts +++ b/src/transformers/visitors/toCircuitVisitor.ts @@ -772,6 +772,7 @@ let childOfSecret = path.getAncestorOfType('ForStatement')?.containsSecret; if(path.getAncestorOfType('ForStatement') && expression.containsPublic ){ childOfSecret = false; } + const thisState = { interactsWithSecretInScope: false }; path.traverseNodesFast(n => { @@ -780,10 +781,29 @@ let childOfSecret = path.getAncestorOfType('ForStatement')?.containsSecret; } }, thisState); + + const leftHandSideInteracts = expression.leftHandSide && scope.getReferencedIndicator(expression.leftHandSide)?.interactsWithSecret; + const rightHandSideInteracts = expression.rightHandSide && scope.getReferencedIndicator(expression.rightHandSide)?.interactsWithSecret; + + expression.leftHandSide.containsSecret = false; + expression.rightHandSide.containsSecret = false; + + // Mark leftHandSide and rightHandSide if they interact with a secret + if (leftHandSideInteracts) { + expression.leftHandSide.containsSecret = true; + } + if (rightHandSideInteracts) { + expression.rightHandSide.containsSecret = true; + } + if (!node.containsSecret && !childOfSecret && !thisState.interactsWithSecretInScope) { state.skipSubNodes = true; return; + // if (!expression.leftHandSide.containsSecret && !expression.rightHandSide.containsSecret && !thisState.interactsWithSecretInScope) { + // state.skipSubNodes = true; + // return; } + const { isIncremented, isDecremented } = expression; let newNode: any; diff --git a/test/contracts/Circuit-interactSecret b/test/contracts/Circuit-interactSecret new file mode 100644 index 00000000..5c2cfe15 --- /dev/null +++ b/test/contracts/Circuit-interactSecret @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: CC0 +pragma solidity ^0.8.0; + +contract Assign { + secret uint256 private a; + uint256 public c; + + function addC(uint256 value) public { + + c += a * value; + } + + function setA(uint256 newValue) public { + a = newValue; + } +}