diff --git a/contracts/mocks/account/AccountZKEmailMock.sol b/contracts/mocks/account/AccountZKEmailMock.sol index d46e3606..75dda0f2 100644 --- a/contracts/mocks/account/AccountZKEmailMock.sol +++ b/contracts/mocks/account/AccountZKEmailMock.sol @@ -7,9 +7,8 @@ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Hol import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import {ERC7739, EIP712} from "../../utils/cryptography/signers/ERC7739.sol"; import {ERC7821} from "../../account/extensions/ERC7821.sol"; -import {SignerZKEmail} from "../../utils/cryptography/signers/SignerZKEmail.sol"; +import {IVerifier, SignerZKEmail} from "../../utils/cryptography/signers/SignerZKEmail.sol"; import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol"; -import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; contract AccountZKEmailMock is Account, SignerZKEmail, ERC7739, ERC7821, ERC721Holder, ERC1155Holder { constructor( diff --git a/contracts/mocks/utils/cryptography/ZKEmailVerifierMock.sol b/contracts/mocks/utils/cryptography/ZKEmailVerifierMock.sol index 2e59a51c..6435fb33 100644 --- a/contracts/mocks/utils/cryptography/ZKEmailVerifierMock.sol +++ b/contracts/mocks/utils/cryptography/ZKEmailVerifierMock.sol @@ -2,7 +2,8 @@ pragma solidity ^0.8.20; -import {IVerifier, EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; +import {EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; +import {IVerifier} from "../../../utils/cryptography/ZKEmailUtils.sol"; contract ZKEmailVerifierMock is IVerifier { function commandBytes() external pure returns (uint256) { @@ -10,7 +11,8 @@ contract ZKEmailVerifierMock is IVerifier { return 605; } - function verifyEmailProof(EmailProof memory proof) external pure returns (bool) { - return proof.proof.length > 0 && bytes1(proof.proof[0]) == 0x01; // boolean true + function verifyEmailProof(bytes memory proof) external pure returns (bool) { + EmailProof memory emailProof = abi.decode(proof, (EmailProof)); + return emailProof.proof.length > 0 && bytes1(emailProof.proof[0]) == 0x01; // boolean true } } diff --git a/contracts/utils/cryptography/ZKEmailUtils.sol b/contracts/utils/cryptography/ZKEmailUtils.sol index 3f99b1f8..c6dab72a 100644 --- a/contracts/utils/cryptography/ZKEmailUtils.sol +++ b/contracts/utils/cryptography/ZKEmailUtils.sol @@ -5,10 +5,14 @@ pragma solidity ^0.8.24; import {Bytes} from "@openzeppelin/contracts/utils/Bytes.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol"; -import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; import {EmailAuthMsg} from "@zk-email/email-tx-builder/src/interfaces/IEmailTypes.sol"; import {CommandUtils} from "@zk-email/email-tx-builder/src/libraries/CommandUtils.sol"; +interface IVerifier { + function commandBytes() external view returns (uint256); + function verifyEmailProof(bytes memory proof) external view returns (bool); +} + /** * @dev Library for https://docs.zk.email[ZKEmail] signature validation utilities. * @@ -102,7 +106,10 @@ library ZKEmailUtils { ) { return EmailProofError.DKIMPublicKeyHash; } else { - return verifier.verifyEmailProof(emailAuthMsg.proof) ? EmailProofError.NoError : EmailProofError.EmailProof; + return + verifier.verifyEmailProof(abi.encode(emailAuthMsg.proof)) + ? EmailProofError.NoError + : EmailProofError.EmailProof; } } diff --git a/contracts/utils/cryptography/signers/SignerZKEmail.sol b/contracts/utils/cryptography/signers/SignerZKEmail.sol index af59fdc0..a2c3bee9 100644 --- a/contracts/utils/cryptography/signers/SignerZKEmail.sol +++ b/contracts/utils/cryptography/signers/SignerZKEmail.sol @@ -3,10 +3,9 @@ pragma solidity ^0.8.24; import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol"; -import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; import {EmailAuthMsg} from "@zk-email/email-tx-builder/src/interfaces/IEmailTypes.sol"; import {AbstractSigner} from "./AbstractSigner.sol"; -import {ZKEmailUtils} from "../ZKEmailUtils.sol"; +import {IVerifier, ZKEmailUtils} from "../ZKEmailUtils.sol"; /** * @dev Implementation of {AbstractSigner} using https://docs.zk.email[ZKEmail] signatures. diff --git a/contracts/utils/cryptography/verifiers/ERC7913ZKEmailVerifier.sol b/contracts/utils/cryptography/verifiers/ERC7913ZKEmailVerifier.sol index 29a03863..aa4be7a5 100644 --- a/contracts/utils/cryptography/verifiers/ERC7913ZKEmailVerifier.sol +++ b/contracts/utils/cryptography/verifiers/ERC7913ZKEmailVerifier.sol @@ -3,10 +3,9 @@ pragma solidity ^0.8.24; import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol"; -import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; import {EmailAuthMsg} from "@zk-email/email-tx-builder/src/interfaces/IEmailTypes.sol"; import {IERC7913SignatureVerifier} from "../../../interfaces/IERC7913.sol"; -import {ZKEmailUtils} from "../ZKEmailUtils.sol"; +import {IVerifier, ZKEmailUtils} from "../ZKEmailUtils.sol"; /** * @dev ERC-7913 signature verifier that supports ZKEmail accounts. diff --git a/test/utils/cryptography/ZKEmailUtils.t.sol b/test/utils/cryptography/ZKEmailUtils.t.sol index 070edcd5..2b88e069 100644 --- a/test/utils/cryptography/ZKEmailUtils.t.sol +++ b/test/utils/cryptography/ZKEmailUtils.t.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.24; import {Test} from "forge-std/Test.sol"; -import {ZKEmailUtils} from "../../../contracts/utils/cryptography/ZKEmailUtils.sol"; +import {IVerifier, ZKEmailUtils} from "../../../contracts/utils/cryptography/ZKEmailUtils.sol"; import {ECDSAOwnedDKIMRegistry} from "@zk-email/email-tx-builder/src/utils/ECDSAOwnedDKIMRegistry.sol"; import {Groth16Verifier} from "@zk-email/email-tx-builder/test/fixtures/Groth16Verifier.sol"; import {Verifier} from "@zk-email/email-tx-builder/src/utils/Verifier.sol"; import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol"; -import {IVerifier, EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; +import {EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {CommandUtils} from "@zk-email/email-tx-builder/src/libraries/CommandUtils.sol"; import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; @@ -125,7 +125,7 @@ contract ZKEmailUtilsTest is Test { emailAuthMsg.proof.isCodeExist = isCodeExist; emailAuthMsg.proof.proof = proof; - _mockVerifyEmailProof(emailAuthMsg.proof); + _mockVerifyEmailProof(abi.encode(emailAuthMsg.proof)); // Test validation ZKEmailUtils.EmailProofError err = ZKEmailUtils.isValidZKEmail( @@ -166,7 +166,7 @@ contract ZKEmailUtilsTest is Test { template[0] = commandPrefix; template[1] = CommandUtils.UINT_MATCHER; - _mockVerifyEmailProof(emailAuthMsg.proof); + _mockVerifyEmailProof(abi.encode(emailAuthMsg.proof)); ZKEmailUtils.EmailProofError err = ZKEmailUtils.isValidZKEmail( emailAuthMsg, @@ -205,7 +205,7 @@ contract ZKEmailUtilsTest is Test { emailAuthMsg.proof.isCodeExist = isCodeExist; emailAuthMsg.proof.proof = proof; - _mockVerifyEmailProof(emailAuthMsg.proof); + _mockVerifyEmailProof(abi.encode(emailAuthMsg.proof)); string[] memory template = new string[](2); template[0] = commandPrefix; @@ -251,7 +251,7 @@ contract ZKEmailUtilsTest is Test { template[0] = commandPrefix; template[1] = CommandUtils.ETH_ADDR_MATCHER; - _mockVerifyEmailProof(emailAuthMsg.proof); + _mockVerifyEmailProof(abi.encode(emailAuthMsg.proof)); ZKEmailUtils.EmailProofError err = ZKEmailUtils.isValidZKEmail( emailAuthMsg, @@ -380,7 +380,7 @@ contract ZKEmailUtilsTest is Test { Verifier verifier = new Verifier(); Groth16Verifier groth16Verifier = new Groth16Verifier(); verifier.initialize(msg.sender, address(groth16Verifier)); - return verifier; + return IVerifier(address(verifier)); } function _createECDSAOwnedDKIMRegistry() private returns (IDKIMRegistry) { @@ -394,7 +394,7 @@ contract ZKEmailUtilsTest is Test { return ecdsaDkim; } - function _mockVerifyEmailProof(EmailProof memory emailProof) private { + function _mockVerifyEmailProof(bytes memory emailProof) private { vm.mockCall(address(_verifier), abi.encodeCall(IVerifier.verifyEmailProof, (emailProof)), abi.encode(true)); }