diff --git a/packages/contracts/script/DeployCommons.s.sol b/packages/contracts/script/DeployCommons.s.sol index 9a392170..f547e03d 100644 --- a/packages/contracts/script/DeployCommons.s.sol +++ b/packages/contracts/script/DeployCommons.s.sol @@ -6,6 +6,7 @@ import "forge-std/Script.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../test/helpers/SimpleWallet.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../src/utils/ForwardDKIMRegistry.sol"; import "../src/EmailAuth.sol"; @@ -80,9 +81,13 @@ contract Deploy is Script { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (initialOwner)) + abi.encodeCall( + verifierImpl.initialize, + (initialOwner, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); console.log("Verifier deployed at: %s", address(verifier)); diff --git a/packages/contracts/script/DeployRecoveryController.s.sol b/packages/contracts/script/DeployRecoveryController.s.sol index 5df2c89a..0251e36d 100644 --- a/packages/contracts/script/DeployRecoveryController.s.sol +++ b/packages/contracts/script/DeployRecoveryController.s.sol @@ -7,6 +7,7 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../test/helpers/SimpleWallet.sol"; import "../test/helpers/RecoveryController.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../src/utils/ForwardDKIMRegistry.sol"; import "../src/EmailAuth.sol"; @@ -75,9 +76,13 @@ contract Deploy is Script { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (initialOwner)) + abi.encodeCall( + verifierImpl.initialize, + (initialOwner, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); console.log("Verifier deployed at: %s", address(verifier)); diff --git a/packages/contracts/src/interfaces/IGroth16Verifier.sol b/packages/contracts/src/interfaces/IGroth16Verifier.sol new file mode 100644 index 00000000..47bc46fd --- /dev/null +++ b/packages/contracts/src/interfaces/IGroth16Verifier.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +interface IGroth16Verifier { + function verifyProof( + uint[2] calldata _pA, + uint[2][2] calldata _pB, + uint[2] calldata _pC, + uint[34] calldata _pubSignals + ) external view returns (bool); +} diff --git a/packages/contracts/src/utils/Verifier.sol b/packages/contracts/src/utils/Verifier.sol index 8a490f2c..753c76ff 100644 --- a/packages/contracts/src/utils/Verifier.sol +++ b/packages/contracts/src/utils/Verifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; -import "./Groth16Verifier.sol"; +import "../interfaces/IGroth16Verifier.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -17,7 +17,7 @@ struct EmailProof { } contract Verifier is OwnableUpgradeable, UUPSUpgradeable { - Groth16Verifier groth16Verifier; + IGroth16Verifier groth16Verifier; uint256 public constant DOMAIN_FIELDS = 9; uint256 public constant DOMAIN_BYTES = 255; @@ -28,9 +28,12 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { /// @notice Initialize the contract with the initial owner and deploy Groth16Verifier /// @param _initialOwner The address of the initial owner - function initialize(address _initialOwner) public initializer { + function initialize( + address _initialOwner, + address _groth16Verifier + ) public initializer { __Ownable_init(_initialOwner); - groth16Verifier = new Groth16Verifier(); + groth16Verifier = IGroth16Verifier(_groth16Verifier); } function verifyEmailProof( diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index 628022b3..a7f59a5e 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -9,6 +9,7 @@ import "@zk-email/contracts/DKIMRegistry.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "../src/EmailAuth.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; import "./helpers/SimpleWallet.sol"; import "./helpers/RecoveryController.sol"; @@ -83,9 +84,13 @@ contract IntegrationTest is Test { // Create Verifier { Verifier verifierImpl = new Verifier(); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (msg.sender)) + abi.encodeCall( + verifierImpl.initialize, + (msg.sender, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); } diff --git a/packages/contracts/test/helpers/DeploymentHelper.sol b/packages/contracts/test/helpers/DeploymentHelper.sol index c3e720fe..b4bcc5c5 100644 --- a/packages/contracts/test/helpers/DeploymentHelper.sol +++ b/packages/contracts/test/helpers/DeploymentHelper.sol @@ -7,6 +7,7 @@ import "forge-std/console.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../../src/EmailAuth.sol"; import "../../src/utils/Verifier.sol"; +import "../../src/utils/Groth16Verifier.sol"; import "../../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../../src/utils/ForwardDKIMRegistry.sol"; import {UserOverrideableDKIMRegistry} from "@zk-email/contracts/UserOverrideableDKIMRegistry.sol"; @@ -92,9 +93,13 @@ contract DeploymentHelper is Test { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (msg.sender)) + abi.encodeCall( + verifierImpl.initialize, + (msg.sender, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); }